diff --git a/DEPS b/DEPS
index eb6263e..36ad85b 100644
--- a/DEPS
+++ b/DEPS
@@ -144,7 +144,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'ff2e8fe65f5610a846c69ef5fb12a3fba524dce1',
+  'skia_revision': '96d2ee0fd0bb09d1505a89987341557bbdf2fcff',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -156,11 +156,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '6f0780f8e42e97353a801cbf5c9baae11238df6d',
+  'angle_revision': 'ec9ff8ce3909ec618842d1922aacf6c6cd961b2e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '52ce1e9f23861cddc58db9646f32de67d8808111',
+  'swiftshader_revision': '6448bd6606392e3fec18b2b7fb7fb43da5a2996e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -275,11 +275,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'shaderc_revision': '1f2dec1e12341170ebdc7723111ec17537cf8336',
+  'shaderc_revision': '72988e40a45ea46bfd615420b060c0b923a7a866',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'c8ab96cdd907c53a6147beaf3e2dcda943818e3f',
+  'dawn_revision': '4af9808400d993f58977ed7d320b1f912e92573f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -808,7 +808,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '83b0f9357fe17c0b9fd97a78bc57967ea6315bc6',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd6f3722b5323b8a1db14c2061e610bac90f0ad10',
       'condition': 'checkout_linux',
   },
 
@@ -833,7 +833,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '65c2b1e1d17e7f444b965a5eeefa2af8f0d61216',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '0fb33b26eb533a6f6184cab75ad50c229ee5c130',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -883,7 +883,7 @@
   },
 
   'src/third_party/grpc/src': {
-      'url': Var('chromium_git') + '/external/github.com/grpc/grpc.git' + '@' + 'c007642f109a2f50b8ed3e4626880539ba55aca5',
+      'url': Var('chromium_git') + '/external/github.com/grpc/grpc.git' + '@' + '74b981a6a3d9ba17f3acae1d72b9109325ef656d',
   },
 
   'src/third_party/freetype/src':
@@ -1194,7 +1194,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '8707d4db8017e42563b45565dd0fdad217860d4a',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '3d5856c03a84d75057ce46e168e055811f8f9611',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1403,7 +1403,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9a756b715c2871026e698448c22dc30e520ad88b',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ded8bf94b4c3b28429000446e038f3e252c17072',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 07008ac0..6edfa6db 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -190,8 +190,6 @@
     "assistant/assistant_interaction_controller.h",
     "assistant/assistant_notification_controller.cc",
     "assistant/assistant_notification_controller.h",
-    "assistant/assistant_notification_expiry_monitor.cc",
-    "assistant/assistant_notification_expiry_monitor.h",
     "assistant/assistant_screen_context_controller.cc",
     "assistant/assistant_screen_context_controller.h",
     "assistant/assistant_settings.cc",
@@ -221,6 +219,8 @@
     "dbus/ash_dbus_services.h",
     "dbus/display_service_provider.cc",
     "dbus/display_service_provider.h",
+    "dbus/gesture_properties_service_provider.cc",
+    "dbus/gesture_properties_service_provider.h",
     "dbus/liveness_service_provider.cc",
     "dbus/liveness_service_provider.h",
     "dbus/url_handler_service_provider.cc",
@@ -1413,6 +1413,7 @@
     "//ui/message_center",
     "//ui/native_theme",
     "//ui/ozone",
+    "//ui/ozone/public/interfaces:gesture_properties_service",
     "//ui/platform_window",
     "//ui/platform_window/stub",
     "//ui/snapshot",
@@ -1563,6 +1564,7 @@
 copy("dbus_service_files") {
   sources = [
     "dbus/org.chromium.DisplayService.conf",
+    "dbus/org.chromium.GesturePropertiesService.conf",
     "dbus/org.chromium.LivenessService.conf",
     "dbus/org.chromium.UrlHandlerService.conf",
   ]
@@ -1601,13 +1603,13 @@
     "app_menu/notification_menu_view_unittest.cc",
     "app_menu/notification_overflow_view_unittest.cc",
     "assistant/assistant_controller_unittest.cc",
-    "assistant/assistant_notification_controller_unittest.cc",
     "assistant/assistant_screen_context_controller_unittest.cc",
     "assistant/model/assistant_query_history_unittest.cc",
     "assistant/ui/assistant_container_view_unittest.cc",
     "assistant/util/deep_link_util_unittest.cc",
     "autoclick/autoclick_drag_event_rewriter_unittest.cc",
     "autoclick/autoclick_unittest.cc",
+    "dbus/gesture_properties_service_provider_unittest.cc",
     "dbus/url_handler_service_provider_unittest.cc",
     "detachable_base/detachable_base_handler_unittest.cc",
     "detachable_base/detachable_base_notification_controller_unittest.cc",
@@ -1933,6 +1935,7 @@
     "//chromeos/dbus/hammerd",
     "//chromeos/dbus/power",
     "//chromeos/dbus/power:power_manager_proto",
+    "//chromeos/dbus/services:test_support",
 
     # TODO(https://crbug.com/644355): Remove Shill dependencies.
     "//chromeos/network:test_support",
@@ -1997,6 +2000,7 @@
     "//ui/message_center",
     "//ui/message_center:test_support",
     "//ui/message_center/public/cpp",
+    "//ui/ozone/testhelpers:mock_gesture_properties_service",
     "//ui/resources",
     "//ui/snapshot",
     "//ui/strings",
diff --git a/ash/app_list/model/search/search_model.cc b/ash/app_list/model/search/search_model.cc
index 7de4def..9c49536 100644
--- a/ash/app_list/model/search/search_model.cc
+++ b/ash/app_list/model/search/search_model.cc
@@ -53,9 +53,8 @@
     if (matches.size() == max_results)
       break;
     SearchResult* item = results->GetItemAt(i);
-    if (result_filter.Run(*item)) {
+    if (result_filter.Run(*item))
       matches.push_back(item);
-    }
   }
   return matches;
 }
diff --git a/ash/app_list/views/search_result_tile_item_list_view.cc b/ash/app_list/views/search_result_tile_item_list_view.cc
index 5e7a5f00..04c794b 100644
--- a/ash/app_list/views/search_result_tile_item_list_view.cc
+++ b/ash/app_list/views/search_result_tile_item_list_view.cc
@@ -254,19 +254,20 @@
   base::string16 query;
   base::TrimWhitespace(raw_query, base::TRIM_ALL, &query);
 
-  // We ask for |max_search_result_tiles_| total results, and we prefer
-  // reinstall candidates if appropriate. we fetch |reinstall_results| first,
-  // and front-fill the rest from the regular result types.
-  auto reinstall_filter =
+  // We ask for |max_search_result_tiles_| policy tile results first,
+  // then add them to their preferred position in the tile list if found.
+  auto policy_tiles_filter =
       base::BindRepeating([](const SearchResult& r) -> bool {
-        return r.display_type() ==
-                   ash::SearchResultDisplayType::kRecommendation &&
-               r.result_type() == ash::SearchResultType::kPlayStoreReinstallApp;
+        return r.display_location() ==
+                   ash::SearchResultDisplayLocation::kTileListContainer &&
+               r.display_index() != ash::SearchResultDisplayIndex::kUndefined &&
+               r.display_type() ==
+                   ash::SearchResultDisplayType::kRecommendation;
       });
-  std::vector<SearchResult*> reinstall_results =
+  std::vector<SearchResult*> policy_tiles_results =
       is_app_reinstall_recommendation_enabled_ && query.empty()
           ? SearchModel::FilterSearchResultsByFunction(
-                results(), reinstall_filter, max_search_result_tiles_)
+                results(), policy_tiles_filter, max_search_result_tiles_)
           : std::vector<SearchResult*>();
 
   SearchResult::DisplayType display_type =
@@ -274,10 +275,11 @@
           ? (query.empty() ? ash::SearchResultDisplayType::kRecommendation
                            : ash::SearchResultDisplayType::kTile)
           : ash::SearchResultDisplayType::kTile;
-  size_t display_num = max_search_result_tiles_ - reinstall_results.size();
+  size_t display_num = max_search_result_tiles_ - policy_tiles_results.size();
 
-  // Do not display the continue reading app in the search result list.
-  auto non_reinstall_filter = base::BindRepeating(
+  // Do not display the repeat reinstall results or continue reading app in the
+  // search result list.
+  auto non_policy_tiles_filter = base::BindRepeating(
       [](const SearchResult::DisplayType& display_type,
          const SearchResult& r) -> bool {
         return r.display_type() == display_type &&
@@ -288,11 +290,25 @@
       display_type);
   std::vector<SearchResult*> display_results =
       SearchModel::FilterSearchResultsByFunction(
-          results(), non_reinstall_filter, display_num);
+          results(), non_policy_tiles_filter, display_num);
 
-  // Append the reinstalls to the display results.
-  display_results.insert(display_results.end(), reinstall_results.begin(),
-                         reinstall_results.end());
+  // Policy tile results will be appended to the final tiles list
+  // based on their specified index. If the requested index is out of
+  // range of the current list, the result will be appended to the back.
+  std::sort(policy_tiles_results.begin(), policy_tiles_results.end(),
+            [](const SearchResult* r1, const SearchResult* r2) -> bool {
+              return r1->display_index() < r2->display_index();
+            });
+
+  for (auto* result : policy_tiles_results) {
+    // if the app is requesting to be placed in an index out of bounds
+    if (result->display_index() + 1 > display_results.size()) {
+      display_results.emplace_back(result);
+    } else {
+      display_results.emplace(display_results.begin() + result->display_index(),
+                              result);
+    }
+  }
   return display_results;
 }
 
diff --git a/ash/app_list/views/search_result_tile_item_list_view_unittest.cc b/ash/app_list/views/search_result_tile_item_list_view_unittest.cc
index 1bfd473..abb8a5f3 100644
--- a/ash/app_list/views/search_result_tile_item_list_view_unittest.cc
+++ b/ash/app_list/views/search_result_tile_item_list_view_unittest.cc
@@ -29,6 +29,9 @@
 constexpr size_t kInstalledApps = 4;
 constexpr size_t kPlayStoreApps = 2;
 constexpr size_t kRecommendedApps = 1;
+
+// used to test when multiple policy chips have been added
+constexpr size_t kMultipleRecommendedApps = 3;
 }  // namespace
 
 class SearchResultTileItemListViewTest
@@ -125,6 +128,9 @@
         result->set_result_id("RecommendedApp " + base::NumberToString(i));
         result->set_display_type(ash::SearchResultDisplayType::kRecommendation);
         result->set_result_type(ash::SearchResultType::kPlayStoreReinstallApp);
+        result->set_display_location(
+            ash::SearchResultDisplayLocation::kTileListContainer);
+        result->set_display_index(ash::SearchResultDisplayIndex::kSixthIndex);
         result->set_title(base::ASCIIToUTF16("RecommendedApp ") +
                           base::NumberToString16(i));
         result->SetRating(1 + i);
@@ -137,6 +143,73 @@
     RunPendingMessages();
   }
 
+  void SetUpSearchResultsWithMultiplePolicies() {
+    SearchModel::SearchResults* results = GetResults();
+
+    const ash::SearchResultDisplayIndex policy_indexes[3] = {
+        ash::SearchResultDisplayIndex::kFourthIndex,
+        ash::SearchResultDisplayIndex::kFifthIndex,
+        ash::SearchResultDisplayIndex::kSixthIndex,
+    };
+
+    // Populate results for installed applications.
+    for (size_t i = 0; i < kInstalledApps; ++i) {
+      std::unique_ptr<TestSearchResult> result =
+          std::make_unique<TestSearchResult>();
+      result->set_result_id("InstalledApp " + base::NumberToString(i));
+      result->set_display_type(ash::SearchResultDisplayType::kTile);
+      result->set_result_type(ash::SearchResultType::kInstalledApp);
+      result->set_title(base::ASCIIToUTF16("InstalledApp ") +
+                        base::NumberToString16(i));
+      results->Add(std::move(result));
+    }
+
+    // Populate results for Play Store search applications.
+    if (IsPlayStoreAppSearchEnabled()) {
+      for (size_t i = 0; i < kPlayStoreApps; ++i) {
+        std::unique_ptr<TestSearchResult> result =
+            std::make_unique<TestSearchResult>();
+        result->set_result_id("PlayStoreApp " + base::NumberToString(i));
+        result->set_display_type(ash::SearchResultDisplayType::kTile);
+        result->set_result_type(ash::SearchResultType::kPlayStoreApp);
+        result->set_title(base::ASCIIToUTF16("PlayStoreApp ") +
+                          base::NumberToString16(i));
+        result->SetRating(1 + i);
+        result->SetFormattedPrice(base::ASCIIToUTF16("Price ") +
+                                  base::NumberToString16(i));
+        results->Add(std::move(result));
+      }
+    }
+
+    if (IsReinstallAppRecommendationEnabled()) {
+      for (size_t i = 0; i < kMultipleRecommendedApps; ++i) {
+        std::unique_ptr<TestSearchResult> result =
+            std::make_unique<TestSearchResult>();
+        result->set_result_id("RecommendedApp " + base::NumberToString(i));
+        result->set_display_type(ash::SearchResultDisplayType::kRecommendation);
+        result->set_result_type(ash::SearchResultType::kPlayStoreReinstallApp);
+        result->set_display_location(
+            ash::SearchResultDisplayLocation::kTileListContainer);
+        result->set_display_index(policy_indexes[i]);
+        result->set_title(base::ASCIIToUTF16("RecommendedApp ") +
+                          base::NumberToString16(i));
+        result->SetRating(1 + i);
+        results->Add(std::move(result));
+      }
+    }
+
+    for (size_t i = 0; i < results->item_count(); ++i) {
+      if (results->GetItemAt(i)->display_index() !=
+          ash::SearchResultDisplayIndex::kUndefined) {
+        results->Move(i, results->GetItemAt(i)->display_index());
+      }
+    }
+
+    // Adding results calls SearchResultContainerView::ScheduleUpdate().
+    // It will post a delayed task to update the results and relayout.
+    RunPendingMessages();
+  }
+
   size_t GetOpenResultCount(int ranking) {
     return view_delegate_.open_search_result_counts()[ranking];
   }
@@ -244,6 +317,29 @@
   }
 }
 
+TEST_P(SearchResultTileItemListViewTest, TestRecommendations) {
+  CreateSearchResultTileItemListView();
+  SetUpSearchResultsWithMultiplePolicies();
+
+  const size_t child_step = 2;
+
+  size_t first_index = kInstalledApps + kMultipleRecommendedApps;
+
+  if (IsReinstallAppRecommendationEnabled()) {
+    size_t stepper = IsPlayStoreAppSearchEnabled() ? 3 : 2;
+    for (size_t i = 0; i < stepper; ++i) {
+      ui::AXNodeData node_data;
+      view()->children()[first_index + (i)*child_step]->GetAccessibleNodeData(
+          &node_data);
+      EXPECT_EQ(ax::mojom::Role::kButton, node_data.role);
+      EXPECT_EQ(
+          "RecommendedApp " + base::NumberToString(i) + ", Star rating " +
+              base::NumberToString(i + 1) + ".0, App recommendation",
+          node_data.GetStringAttribute(ax::mojom::StringAttribute::kName));
+    }
+  }
+}
+
 INSTANTIATE_TEST_SUITE_P(,
                          SearchResultTileItemListViewTest,
                          testing::ValuesIn({std::make_pair(false, false),
diff --git a/ash/app_list/views/suggestion_chip_container_view.cc b/ash/app_list/views/suggestion_chip_container_view.cc
index e77b757..ef78cf1 100644
--- a/ash/app_list/views/suggestion_chip_container_view.cc
+++ b/ash/app_list/views/suggestion_chip_container_view.cc
@@ -4,6 +4,7 @@
 
 #include "ash/app_list/views/suggestion_chip_container_view.h"
 
+#include <algorithm>
 #include <memory>
 
 #include "ash/app_list/app_list_util.h"
@@ -28,16 +29,10 @@
 // The spacing between chips.
 constexpr int kChipSpacing = 8;
 
-// Sort suggestion chip results by |display_index| value in ascending order.
-bool IndexOrdering(const SearchResult* result1, const SearchResult* result2) {
-  return result1->display_index() < result2->display_index();
-}
-
-bool IsPolicySuggestionChip(const SearchResult* result) {
-  return result->display_location() ==
+bool IsPolicySuggestionChip(const SearchResult& result) {
+  return result.display_location() ==
              ash::SearchResultDisplayLocation::kSuggestionChipContainer &&
-         result->display_index() !=
-             ash::SearchResultDisplayIndex::kPlacementUndefined;
+         result.display_index() != ash::SearchResultDisplayIndex::kUndefined;
 }
 
 }  // namespace
@@ -87,7 +82,7 @@
   // Filter out priority suggestion chips with a non-default value
   // for |display_index|.
   auto filter_indexed_policy_chips = [](const SearchResult& r) -> bool {
-    return IsPolicySuggestionChip(&r);
+    return IsPolicySuggestionChip(r);
   };
   std::vector<SearchResult*> indexed_policy_results =
       SearchModel::FilterSearchResultsByFunction(
@@ -95,7 +90,9 @@
           AppListConfig::instance().num_start_page_tiles());
 
   std::sort(indexed_policy_results.begin(), indexed_policy_results.end(),
-            &IndexOrdering);
+            [](const SearchResult* r1, const SearchResult* r2) -> bool {
+              return r1->display_index() < r2->display_index();
+            });
 
   // Need to filter out kArcAppShortcut since it will be confusing to users
   // if shortcuts are displayed as suggestion chips. Also filter out any
@@ -104,7 +101,7 @@
     return r.display_type() == ash::SearchResultDisplayType::kRecommendation &&
            r.result_type() != ash::SearchResultType::kPlayStoreReinstallApp &&
            r.result_type() != ash::SearchResultType::kArcAppShortcut &&
-           !IsPolicySuggestionChip(&r);
+           !IsPolicySuggestionChip(r);
   };
   std::vector<SearchResult*> display_results =
       SearchModel::FilterSearchResultsByFunction(
@@ -115,11 +112,9 @@
   // Update display results list by placing policy result chips at their
   // specified |display_index|.
   for (auto* result : indexed_policy_results) {
-    std::vector<SearchResult*>::iterator desired_index =
-        display_results.begin() + result->display_index();
-    display_results.emplace(desired_index, result);
+    display_results.emplace(display_results.begin() + result->display_index(),
+                            result);
   }
-
   // Update search results here, but wait until layout to add them as child
   // views when we know this view's bounds.
   for (size_t i = 0; i < static_cast<size_t>(
diff --git a/ash/assistant/assistant_notification_controller.cc b/ash/assistant/assistant_notification_controller.cc
index 1e32def2..6328039 100644
--- a/ash/assistant/assistant_notification_controller.cc
+++ b/ash/assistant/assistant_notification_controller.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "ash/assistant/assistant_controller.h"
-#include "ash/assistant/assistant_notification_expiry_monitor.h"
 #include "ash/assistant/util/deep_link_util.h"
 #include "ash/public/cpp/notification_utils.h"
 #include "ash/public/cpp/vector_icons/vector_icons.h"
@@ -82,7 +81,6 @@
     AssistantController* assistant_controller)
     : assistant_controller_(assistant_controller),
       binding_(this),
-      expiry_monitor_(this),
       notifier_id_(GetNotifierId()) {
   AddModelObserver(this);
   assistant_controller_->AddObserver(this);
diff --git a/ash/assistant/assistant_notification_controller.h b/ash/assistant/assistant_notification_controller.h
index 6a7e63e0..bd1655b 100644
--- a/ash/assistant/assistant_notification_controller.h
+++ b/ash/assistant/assistant_notification_controller.h
@@ -9,7 +9,6 @@
 
 #include "ash/ash_export.h"
 #include "ash/assistant/assistant_controller_observer.h"
-#include "ash/assistant/assistant_notification_expiry_monitor.h"
 #include "ash/assistant/model/assistant_notification_model.h"
 #include "ash/assistant/model/assistant_notification_model_observer.h"
 #include "ash/assistant/model/assistant_ui_model_observer.h"
@@ -98,7 +97,6 @@
   mojo::Binding<mojom::AssistantNotificationController> binding_;
 
   AssistantNotificationModel model_;
-  AssistantNotificationExpiryMonitor expiry_monitor_;
 
   // Owned by AssistantController.
   chromeos::assistant::mojom::Assistant* assistant_ = nullptr;
diff --git a/ash/assistant/assistant_notification_controller_unittest.cc b/ash/assistant/assistant_notification_controller_unittest.cc
deleted file mode 100644
index 0fa00a5..0000000
--- a/ash/assistant/assistant_notification_controller_unittest.cc
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_notification_controller.h"
-
-#include "ash/assistant/assistant_controller.h"
-#include "ash/assistant/model/assistant_notification_model_observer.h"
-#include "ash/shell.h"
-#include "ash/test/ash_test_base.h"
-#include "base/test/scoped_task_environment.h"
-#include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace ash {
-
-using chromeos::assistant::mojom::AssistantNotificationPtr;
-using testing::_;
-using testing::Eq;
-using testing::Field;
-using testing::StrictMock;
-
-constexpr bool kAnyBool = false;
-
-class AssistantNotificationModelObserverMock
-    : public AssistantNotificationModelObserver {
- public:
-  AssistantNotificationModelObserverMock() = default;
-  ~AssistantNotificationModelObserverMock() override = default;
-
-  MOCK_METHOD1(OnNotificationAdded,
-               void(const AssistantNotification* notification));
-  MOCK_METHOD1(OnNotificationUpdated,
-               void(const AssistantNotification* notification));
-  MOCK_METHOD2(OnNotificationRemoved,
-               void(const AssistantNotification* notification,
-                    bool from_server));
-  MOCK_METHOD1(OnAllNotificationsRemoved, void(bool from_server));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AssistantNotificationModelObserverMock);
-};
-
-MATCHER_P(IdIs, expected_id, "") {
-  if (arg->client_id != expected_id) {
-    *result_listener << "Received notification with a wrong id.\n"
-                     << "Expected:\n    '" << expected_id << "'\n"
-                     << "Actual:\n    '" << arg->client_id << "'\n";
-    return false;
-  }
-  return true;
-}
-
-class AssistantNotificationControllerTest : public AshTestBase {
- protected:
-  AssistantNotificationControllerTest() {
-    DestroyScopedTaskEnvironment();
-    scoped_task_environment_ = std::make_unique<
-        base::test::ScopedTaskEnvironment>(
-        base::test::ScopedTaskEnvironment::MainThreadType::UI_MOCK_TIME,
-        base::test::ScopedTaskEnvironment::NowSource::MAIN_THREAD_MOCK_TIME);
-  }
-  ~AssistantNotificationControllerTest() override = default;
-
-  void SetUp() override {
-    ASSERT_TRUE(chromeos::switches::IsAssistantEnabled());
-
-    AshTestBase::SetUp();
-
-    controller_ =
-        Shell::Get()->assistant_controller()->notification_controller();
-    DCHECK(controller_);
-  }
-
-  AssistantNotificationController& controller() { return *controller_; }
-
-  AssistantNotificationModelObserverMock& AddStrictObserverMock() {
-    observer_ =
-        std::make_unique<StrictMock<AssistantNotificationModelObserverMock>>();
-    controller().AddModelObserver(observer_.get());
-    return *observer_;
-  }
-
-  AssistantNotificationPtr CreateNotification(const std::string& id) {
-    auto notification =
-        chromeos::assistant::mojom::AssistantNotification::New();
-    notification->client_id = id;
-    return notification;
-  }
-
-  AssistantNotificationPtr CreateNotification(const std::string& id,
-                                              int timeout_ms) {
-    auto result = CreateNotification(id);
-    result->expiry_time =
-        base::Time::Now() + base::TimeDelta::FromMilliseconds(timeout_ms);
-    return result;
-  }
-
-  void AddNotification(const std::string& id, int timeout_ms) {
-    controller().AddOrUpdateNotification(CreateNotification(id, timeout_ms));
-  }
-
-  void AddNotification(const std::string& id) {
-    controller().AddOrUpdateNotification(CreateNotification(id));
-  }
-
-  void UpdateNotification(const std::string& id, int timeout_ms) {
-    controller().AddOrUpdateNotification(CreateNotification(id, timeout_ms));
-  }
-
-  void UpdateNotification(const std::string& id) {
-    controller().AddOrUpdateNotification(CreateNotification(id));
-  }
-
-  void RemoveNotification(const std::string& id) {
-    controller().RemoveNotificationById(id, kAnyBool);
-  }
-
-  void ForwardTimeInMs(int time_in_ms) {
-    scoped_task_environment_->FastForwardBy(
-        base::TimeDelta::FromMilliseconds(time_in_ms));
-  }
-
- private:
-  AssistantNotificationController* controller_;
-  std::unique_ptr<AssistantNotificationModelObserverMock> observer_;
-  std::unique_ptr<base::test::ScopedTaskEnvironment> scoped_task_environment_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssistantNotificationControllerTest);
-};
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldInformObserverOfNewNotifications) {
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationAdded(IdIs("id")));
-
-  controller().AddOrUpdateNotification(CreateNotification("id"));
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldInformObserverOfUpdatedNotifications) {
-  const auto notification = CreateNotification("id");
-  controller().AddOrUpdateNotification(notification.Clone());
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationUpdated(IdIs("id")));
-
-  controller().AddOrUpdateNotification(notification.Clone());
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldInformObserverOfRemovedNotifications) {
-  const auto notification = CreateNotification("id");
-  controller().AddOrUpdateNotification(notification.Clone());
-  constexpr bool from_server = kAnyBool;
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationRemoved(IdIs("id"), Eq(from_server)));
-
-  controller().RemoveNotificationById(notification->client_id, from_server);
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldInformObserverOfRemoveAllNotifications) {
-  const auto notification = CreateNotification("id");
-  controller().AddOrUpdateNotification(notification.Clone());
-  constexpr bool from_server = !kAnyBool;
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnAllNotificationsRemoved(Eq(from_server)));
-
-  controller().RemoveAllNotifications(from_server);
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldRemoveNotificationWhenItExpires) {
-  constexpr int timeout_ms = 1000;
-  AddNotification("id", timeout_ms);
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationRemoved(IdIs("id"), _));
-
-  ForwardTimeInMs(timeout_ms);
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldNotRemoveNotificationsTooSoon) {
-  constexpr int timeout_ms = 1000;
-  AddNotification("id", timeout_ms);
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationRemoved).Times(0);
-  ForwardTimeInMs(timeout_ms - 1);
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldUseFromServerFalseWhenNotificationExpires) {
-  constexpr int timeout_ms = 1000;
-  AddNotification("id", timeout_ms);
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationRemoved(_, Eq(false)));
-
-  ForwardTimeInMs(timeout_ms);
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldRemoveEachNotificationAsItExpires) {
-  constexpr int first_timeout_ms = 1000;
-  constexpr int second_timeout_ms = 1500;
-
-  AddNotification("first", first_timeout_ms);
-  AddNotification("second", second_timeout_ms);
-
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationRemoved(IdIs("first"), _));
-  ForwardTimeInMs(first_timeout_ms);
-
-  EXPECT_CALL(observer, OnNotificationRemoved(IdIs("second"), _));
-  int delta_between_notifications = second_timeout_ms - first_timeout_ms;
-  ForwardTimeInMs(delta_between_notifications);
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldSupport2NotificationsThatExpireAtTheSameTime) {
-  constexpr int timeout_ms = 1000;
-
-  AddNotification("first", timeout_ms);
-  AddNotification("at-same-time", timeout_ms);
-
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationRemoved(IdIs("first"), _));
-  EXPECT_CALL(observer, OnNotificationRemoved(IdIs("at-same-time"), _));
-  ForwardTimeInMs(timeout_ms);
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldImmediateRemoveNotificationsThatAlreadyExpired) {
-  constexpr int negative_timeout = -1000;
-
-  AddNotification("expired", negative_timeout);
-
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationRemoved(IdIs("expired"), _));
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldNotRemoveNotificationsThatWereManuallyRemoved) {
-  constexpr int timeout = 1000;
-
-  AddNotification("id", timeout);
-  RemoveNotification("id");
-
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationRemoved).Times(0);
-  ForwardTimeInMs(timeout);
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldSupportExpiryTimeSetInUpdate) {
-  constexpr int timeout = 1000;
-
-  AddNotification("id");
-  UpdateNotification("id", timeout);
-
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationRemoved);
-  ForwardTimeInMs(timeout);
-}
-
-TEST_F(AssistantNotificationControllerTest,
-       ShouldNotRemoveNotificationIfExpiryTimeIsClearedInUpdate) {
-  constexpr int timeout = 1000;
-
-  AddNotification("id", timeout);
-  UpdateNotification("id");
-
-  auto& observer = AddStrictObserverMock();
-
-  EXPECT_CALL(observer, OnNotificationRemoved).Times(0);
-  ForwardTimeInMs(timeout);
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_notification_expiry_monitor.cc b/ash/assistant/assistant_notification_expiry_monitor.cc
deleted file mode 100644
index ad153820..0000000
--- a/ash/assistant/assistant_notification_expiry_monitor.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_notification_expiry_monitor.h"
-
-#include "ash/assistant/assistant_notification_controller.h"
-#include "ash/assistant/model/assistant_notification_model.h"
-#include "ash/assistant/model/assistant_notification_model_observer.h"
-#include "base/bind.h"
-#include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
-
-namespace ash {
-
-namespace {
-
-bool HasExpired(const AssistantNotificationExpiryMonitor::AssistantNotification*
-                    notification) {
-  return notification->expiry_time.has_value() &&
-         (notification->expiry_time.value() <= base::Time::Now());
-}
-
-// Returns the minimum of the base::Time instances that actually have a value.
-base::Optional<base::Time> Min(base::Optional<base::Time> left,
-                               base::Optional<base::Time> right) {
-  if (!left.has_value())
-    return right;
-
-  if (!right.has_value())
-    return left;
-
-  return std::min(left.value(), right.value());
-}
-
-}  // namespace
-
-class AssistantNotificationExpiryMonitor::Observer
-    : public AssistantNotificationModelObserver {
- public:
-  Observer(AssistantNotificationExpiryMonitor* monitor) : monitor_(monitor) {}
-  ~Observer() override = default;
-
-  void OnNotificationAdded(const AssistantNotification* notification) override {
-    monitor_->UpdateTimer();
-  }
-
-  void OnNotificationUpdated(
-      const AssistantNotification* notification) override {
-    monitor_->UpdateTimer();
-  }
-
-  void OnNotificationRemoved(const AssistantNotification* notification,
-                             bool from_server) override {
-    monitor_->UpdateTimer();
-  }
-
-  void OnAllNotificationsRemoved(bool from_server) override {
-    monitor_->UpdateTimer();
-  }
-
- private:
-  AssistantNotificationExpiryMonitor* const monitor_;
-
-  DISALLOW_COPY_AND_ASSIGN(Observer);
-};
-
-AssistantNotificationExpiryMonitor::AssistantNotificationExpiryMonitor(
-    AssistantNotificationController* controller)
-    : controller_(controller), observer_(std::make_unique<Observer>(this)) {
-  DCHECK(controller_);
-  controller_->AddModelObserver(observer_.get());
-}
-
-AssistantNotificationExpiryMonitor::~AssistantNotificationExpiryMonitor() =
-    default;
-
-void AssistantNotificationExpiryMonitor::UpdateTimer() {
-  base::Optional<base::TimeDelta> timeout = GetTimerTimeout();
-  if (timeout) {
-    timer_.Start(
-        FROM_HERE, timeout.value(),
-        base::BindOnce(
-            &AssistantNotificationExpiryMonitor::RemoveExpiredNotifications,
-            base::Unretained(this)));
-  } else {
-    timer_.Stop();
-  }
-}
-
-base::Optional<base::TimeDelta>
-AssistantNotificationExpiryMonitor::GetTimerTimeout() const {
-  base::Optional<base::Time> endtime = GetTimerEndTime();
-  if (endtime)
-    return endtime.value() - base::Time::Now();
-  return base::nullopt;
-}
-
-base::Optional<base::Time> AssistantNotificationExpiryMonitor::GetTimerEndTime()
-    const {
-  base::Optional<base::Time> result = base::nullopt;
-  for (const AssistantNotification* notification : GetNotifications())
-    result = Min(result, notification->expiry_time);
-  return result;
-}
-
-void AssistantNotificationExpiryMonitor::RemoveExpiredNotifications() {
-  for (const NotificationId& id : GetExpiredNotifications()) {
-    VLOG(1) << "Removing expired notification '" << id << "'";
-    controller_->RemoveNotificationById(id, /*from_server=*/false);
-  }
-
-  UpdateTimer();
-}
-
-std::vector<AssistantNotificationExpiryMonitor::NotificationId>
-AssistantNotificationExpiryMonitor::GetExpiredNotifications() const {
-  std::vector<NotificationId> result;
-  for (const AssistantNotification* notification : GetNotifications()) {
-    if (HasExpired(notification))
-      result.push_back(notification->client_id);
-  }
-  return result;
-}
-
-std::vector<const AssistantNotificationExpiryMonitor::AssistantNotification*>
-AssistantNotificationExpiryMonitor::GetNotifications() const {
-  return controller_->model()->GetNotifications();
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_notification_expiry_monitor.h b/ash/assistant/assistant_notification_expiry_monitor.h
deleted file mode 100644
index ba99e5a1..0000000
--- a/ash/assistant/assistant_notification_expiry_monitor.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_NOTIFICATION_EXPIRY_MONITOR_H_
-#define ASH_ASSISTANT_ASSISTANT_NOTIFICATION_EXPIRY_MONITOR_H_
-
-#include <memory>
-#include <vector>
-
-#include "ash/assistant/model/assistant_notification_model_observer.h"
-#include "base/optional.h"
-#include "base/timer/timer.h"
-
-namespace ash {
-
-class AssistantNotificationController;
-
-// Will track all Assistant notifications by subscribing to the given
-// |controller| and will call
-// |AssistantNotificationController::RemoveNotificationById| when the
-// notification expires (i.e. when the current time passes the value in the
-// expiry_time| field).
-class AssistantNotificationExpiryMonitor {
- public:
-  using AssistantNotification =
-      chromeos::assistant::mojom::AssistantNotification;
-
-  explicit AssistantNotificationExpiryMonitor(
-      AssistantNotificationController* controller);
-  ~AssistantNotificationExpiryMonitor();
-
- private:
-  using NotificationId = std::string;
-  class Observer;
-
-  // Start/stop the timer waiting for the next expiry time.
-  // If the timer is already running this will start a new timer with the
-  // (new) expiry time that will expire first.
-  void UpdateTimer();
-
-  base::Optional<base::TimeDelta> GetTimerTimeout() const;
-  base::Optional<base::Time> GetTimerEndTime() const;
-  void RemoveExpiredNotifications();
-  std::vector<NotificationId> GetExpiredNotifications() const;
-  std::vector<const AssistantNotification*> GetNotifications() const;
-
-  base::OneShotTimer timer_;
-  AssistantNotificationController* const controller_;
-  std::unique_ptr<Observer> observer_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssistantNotificationExpiryMonitor);
-};
-
-}  // namespace ash
-#endif  // ASH_ASSISTANT_ASSISTANT_NOTIFICATION_EXPIRY_MONITOR_H_
diff --git a/ash/assistant/model/assistant_notification_model.cc b/ash/assistant/model/assistant_notification_model.cc
index af725f1..875396f 100644
--- a/ash/assistant/model/assistant_notification_model.cc
+++ b/ash/assistant/model/assistant_notification_model.cc
@@ -79,16 +79,11 @@
 }
 
 std::vector<const chromeos::assistant::mojom::AssistantNotification*>
-AssistantNotificationModel::GetNotifications() const {
-  return GetNotificationsByType(base::nullopt);
-}
-
-std::vector<const chromeos::assistant::mojom::AssistantNotification*>
 AssistantNotificationModel::GetNotificationsByType(
-    base::Optional<AssistantNotificationType> type) const {
+    AssistantNotificationType type) const {
   std::vector<const AssistantNotification*> notifications;
   for (const auto& notification : notifications_) {
-    if (!type || notification.second->type == type.value())
+    if (notification.second->type == type)
       notifications.push_back(notification.second.get());
   }
   return notifications;
diff --git a/ash/assistant/model/assistant_notification_model.h b/ash/assistant/model/assistant_notification_model.h
index a203f99..22c8dbf 100644
--- a/ash/assistant/model/assistant_notification_model.h
+++ b/ash/assistant/model/assistant_notification_model.h
@@ -58,12 +58,8 @@
   const AssistantNotification* GetNotificationById(const std::string& id) const;
 
   // Returns all notifications matching the specified |type|.
-  // Use base::nullopt to return all notifications independent of their type.
   std::vector<const AssistantNotification*> GetNotificationsByType(
-      base::Optional<AssistantNotificationType> type) const;
-
-  // Returns all notifications (that have not been removed).
-  std::vector<const AssistantNotification*> GetNotifications() const;
+      AssistantNotificationType type) const;
 
   // Returns true if the model contains a notification uniquely identified by
   // |id|, otherwise false.
diff --git a/ash/dbus/DEPS b/ash/dbus/DEPS
index 83a2f47..825e5ca3 100644
--- a/ash/dbus/DEPS
+++ b/ash/dbus/DEPS
@@ -3,3 +3,9 @@
   "+chromeos/dbus/services",
   "+dbus",
 ]
+
+specific_include_rules = {
+  ".*test\.cc": [
+    "+gmock/gmock.h",
+  ]
+}
diff --git a/ash/dbus/ash_dbus_services.cc b/ash/dbus/ash_dbus_services.cc
index 5cc7ce67..028f8ab 100644
--- a/ash/dbus/ash_dbus_services.cc
+++ b/ash/dbus/ash_dbus_services.cc
@@ -5,8 +5,11 @@
 #include "ash/dbus/ash_dbus_services.h"
 
 #include "ash/dbus/display_service_provider.h"
+#include "ash/dbus/gesture_properties_service_provider.h"
 #include "ash/dbus/liveness_service_provider.h"
 #include "ash/dbus/url_handler_service_provider.h"
+#include "base/feature_list.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "chromeos/dbus/services/cros_dbus_service.h"
 #include "dbus/object_path.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
@@ -19,6 +22,14 @@
       dbus::ObjectPath(chromeos::kDisplayServicePath),
       chromeos::CrosDBusService::CreateServiceProviderList(
           std::make_unique<DisplayServiceProvider>()));
+  if (base::FeatureList::IsEnabled(
+          chromeos::features::kGesturePropertiesDBusService)) {
+    gesture_properties_service_ = chromeos::CrosDBusService::Create(
+        system_bus, chromeos::kGesturePropertiesServiceName,
+        dbus::ObjectPath(chromeos::kGesturePropertiesServicePath),
+        chromeos::CrosDBusService::CreateServiceProviderList(
+            std::make_unique<GesturePropertiesServiceProvider>()));
+  }
   liveness_service_ = chromeos::CrosDBusService::Create(
       system_bus, chromeos::kLivenessServiceName,
       dbus::ObjectPath(chromeos::kLivenessServicePath),
@@ -33,6 +44,7 @@
 
 AshDBusServices::~AshDBusServices() {
   display_service_.reset();
+  gesture_properties_service_.reset();
   liveness_service_.reset();
   url_handler_service_.reset();
 }
diff --git a/ash/dbus/ash_dbus_services.h b/ash/dbus/ash_dbus_services.h
index 274ffa7..e92486a 100644
--- a/ash/dbus/ash_dbus_services.h
+++ b/ash/dbus/ash_dbus_services.h
@@ -27,6 +27,7 @@
 
  private:
   std::unique_ptr<chromeos::CrosDBusService> display_service_;
+  std::unique_ptr<chromeos::CrosDBusService> gesture_properties_service_;
   std::unique_ptr<chromeos::CrosDBusService> liveness_service_;
   std::unique_ptr<chromeos::CrosDBusService> url_handler_service_;
 
diff --git a/ash/dbus/gesture_properties_service_provider.cc b/ash/dbus/gesture_properties_service_provider.cc
new file mode 100644
index 0000000..0b4d622a
--- /dev/null
+++ b/ash/dbus/gesture_properties_service_provider.cc
@@ -0,0 +1,94 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/dbus/gesture_properties_service_provider.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "dbus/message.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+#include "ui/ozone/public/input_controller.h"
+#include "ui/ozone/public/ozone_platform.h"
+
+namespace ash {
+
+GesturePropertiesServiceProvider::GesturePropertiesServiceProvider()
+    : weak_ptr_factory_(this) {}
+
+GesturePropertiesServiceProvider::~GesturePropertiesServiceProvider() = default;
+
+void GesturePropertiesServiceProvider::Start(
+    scoped_refptr<dbus::ExportedObject> exported_object) {
+  dbus::ExportedObject::OnExportedCallback on_exported =
+      base::BindRepeating(&GesturePropertiesServiceProvider::OnExported,
+                          weak_ptr_factory_.GetWeakPtr());
+  exported_object->ExportMethod(
+      chromeos::kGesturePropertiesServiceInterface,
+      chromeos::kGesturePropertiesServiceListDevicesMethod,
+      base::BindRepeating(&GesturePropertiesServiceProvider::ListDevices,
+                          weak_ptr_factory_.GetWeakPtr()),
+      on_exported);
+}
+
+void GesturePropertiesServiceProvider::OnExported(
+    const std::string& interface_name,
+    const std::string& method_name,
+    bool success) {
+  if (!success)
+    LOG(ERROR) << "Failed to export " << interface_name << "." << method_name;
+}
+
+namespace {
+
+void ListDevicesCallback(
+    std::unique_ptr<dbus::Response> response,
+    const dbus::ExportedObject::ResponseSender& response_sender,
+    const base::flat_map<int, std::string>& result) {
+  dbus::MessageWriter writer(response.get());
+  writer.AppendUint32(result.size());
+  dbus::MessageWriter dict_writer(nullptr);
+  writer.OpenArray("{is}", &dict_writer);
+  for (const auto& pair : result) {
+    dbus::MessageWriter dict_entry_writer(nullptr);
+    dict_writer.OpenDictEntry(&dict_entry_writer);
+    dict_entry_writer.AppendInt32(pair.first);
+    dict_entry_writer.AppendString(pair.second);
+    dict_writer.CloseContainer(&dict_entry_writer);
+  }
+  writer.CloseContainer(&dict_writer);
+  response_sender.Run(std::move(response));
+}
+
+}  // namespace
+
+void GesturePropertiesServiceProvider::ListDevices(
+    dbus::MethodCall* method_call,
+    dbus::ExportedObject::ResponseSender response_sender) {
+  std::unique_ptr<dbus::Response> response =
+      dbus::Response::FromMethodCall(method_call);
+
+  GetService()->ListDevices(base::BindOnce(
+      &ListDevicesCallback, std::move(response), response_sender));
+}
+
+ui::ozone::mojom::GesturePropertiesService*
+GesturePropertiesServiceProvider::GetService() {
+  if (service_for_test_ != nullptr)
+    return service_for_test_;
+
+  if (!service_.is_bound()) {
+    ui::ozone::mojom::GesturePropertiesServiceRequest request =
+        mojo::MakeRequest(&service_);
+    ui::OzonePlatform::GetInstance()
+        ->GetInputController()
+        ->GetGesturePropertiesService(std::move(request));
+  }
+  return service_.get();
+}
+
+}  // namespace ash
diff --git a/ash/dbus/gesture_properties_service_provider.h b/ash/dbus/gesture_properties_service_provider.h
new file mode 100644
index 0000000..cb1b4171
--- /dev/null
+++ b/ash/dbus/gesture_properties_service_provider.h
@@ -0,0 +1,66 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_DBUS_GESTURE_PROPERTIES_SERVICE_PROVIDER_H_
+#define ASH_DBUS_GESTURE_PROPERTIES_SERVICE_PROVIDER_H_
+
+#include "ash/ash_export.h"
+#include "base/containers/flat_map.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "chromeos/dbus/services/cros_dbus_service.h"
+#include "dbus/exported_object.h"
+#include "dbus/message.h"
+#include "ui/ozone/public/interfaces/gesture_properties_service.mojom.h"
+
+namespace dbus {
+class MethodCall;
+}
+
+namespace ash {
+
+/**
+ * Provides a D-Bus bridge to the Mojo GesturePropertiesService, allowing
+ * gesture properties to be easily modified. See the Google-internal design doc
+ * at go/cros-gesture-properties-dbus-design for more details.
+ */
+class ASH_EXPORT GesturePropertiesServiceProvider
+    : public chromeos::CrosDBusService::ServiceProviderInterface {
+ public:
+  GesturePropertiesServiceProvider();
+  ~GesturePropertiesServiceProvider() override;
+
+  void set_service_for_test(
+      ui::ozone::mojom::GesturePropertiesService* service) {
+    service_for_test_ = service;
+  }
+
+  // CrosDBusService::ServiceProviderInterface
+  void Start(scoped_refptr<dbus::ExportedObject> exported_object) override;
+
+ private:
+  // Called from ExportedObject when CheckLiveness() is exported as a D-Bus
+  // method or failed to be exported.
+  void OnExported(const std::string& interface_name,
+                  const std::string& method_name,
+                  bool success);
+
+  // Called on UI thread in response to a D-Bus request.
+  void ListDevices(dbus::MethodCall* method_call,
+                   dbus::ExportedObject::ResponseSender response_sender);
+
+  ui::ozone::mojom::GesturePropertiesService* GetService();
+
+  ui::ozone::mojom::GesturePropertiesServicePtr service_;
+  ui::ozone::mojom::GesturePropertiesService* service_for_test_ = nullptr;
+
+  base::WeakPtrFactory<GesturePropertiesServiceProvider> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(GesturePropertiesServiceProvider);
+};
+
+}  // namespace ash
+
+#endif  // ASH_DBUS_GESTURE_PROPERTIES_SERVICE_PROVIDER_H_
diff --git a/ash/dbus/gesture_properties_service_provider_unittest.cc b/ash/dbus/gesture_properties_service_provider_unittest.cc
new file mode 100644
index 0000000..e23bd42f
--- /dev/null
+++ b/ash/dbus/gesture_properties_service_provider_unittest.cc
@@ -0,0 +1,157 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/dbus/gesture_properties_service_provider.h"
+
+#include "chromeos/dbus/services/service_provider_test_helper.h"
+#include "dbus/message.h"
+#include "dbus/object_path.h"
+#include "gmock/gmock.h"
+#include "services/service_manager/public/cpp/test/test_connector_factory.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+#include "ui/ozone/testhelpers/mock_gesture_properties_service.h"
+
+using ::testing::_;
+using ::testing::ElementsAre;
+using ::testing::InvokeArgument;
+using ::testing::Unused;
+
+namespace ash {
+
+namespace {
+
+uint32_t expect_uint32(dbus::MessageReader* reader) {
+  uint32_t result;
+  EXPECT_TRUE(reader->PopUint32(&result));
+  return result;
+}
+
+int32_t expect_int32(dbus::MessageReader* reader) {
+  int32_t result;
+  EXPECT_TRUE(reader->PopInt32(&result));
+  return result;
+}
+
+std::string expect_string(dbus::MessageReader* reader) {
+  std::string result;
+  EXPECT_TRUE(reader->PopString(&result));
+  return result;
+}
+
+}  // namespace
+
+class GesturePropertiesServiceProviderTest : public testing::Test {
+ public:
+  GesturePropertiesServiceProviderTest() {
+    service_manager::TestConnectorFactory test_connector_factory;
+    mock_service_ = std::make_unique<MockGesturePropertiesService>();
+    ON_CALL(*mock_service_, ListDevices(_))
+        .WillByDefault(Invoke(
+            this, &GesturePropertiesServiceProviderTest::FakeListDevices));
+    ON_CALL(*mock_service_, ListProperties(_, _))
+        .WillByDefault(Invoke(
+            this, &GesturePropertiesServiceProviderTest::FakeListProperties));
+
+    service_provider_ = std::make_unique<GesturePropertiesServiceProvider>();
+    service_provider_->set_service_for_test(mock_service_.get());
+  }
+
+  ~GesturePropertiesServiceProviderTest() override { test_helper_.TearDown(); }
+
+  void FakeListDevices(
+      ui::ozone::mojom::GesturePropertiesService::ListDevicesCallback
+          callback) {
+    std::move(callback).Run(list_devices_response_);
+  }
+
+  void FakeListProperties(
+      Unused,
+      ui::ozone::mojom::GesturePropertiesService::ListPropertiesCallback
+          callback) {
+    std::move(callback).Run(list_properties_response_);
+  }
+
+ protected:
+  void CallDBusMethod(std::string name,
+                      dbus::MethodCall* method_call,
+                      std::unique_ptr<dbus::Response>& response) {
+    test_helper_.SetUp(
+        chromeos::kGesturePropertiesServiceName,
+        dbus::ObjectPath(chromeos::kGesturePropertiesServicePath),
+        chromeos::kGesturePropertiesServiceInterface, name,
+        service_provider_.get());
+    response = test_helper_.CallMethod(method_call);
+    ASSERT_TRUE(response);
+  }
+
+  void CallWithoutParameters(std::string name,
+                             std::unique_ptr<dbus::Response>& response) {
+    dbus::MethodCall* method_call = new dbus::MethodCall(
+        chromeos::kGesturePropertiesServiceInterface, name);
+    CallDBusMethod(name, std::move(method_call), response);
+  }
+
+  void CheckMethodErrorsWithNoParameters(std::string name) {
+    std::unique_ptr<dbus::Response> response = nullptr;
+    CallWithoutParameters(name, response);
+    EXPECT_EQ(dbus::Message::MESSAGE_ERROR, response->GetMessageType());
+  }
+
+  base::flat_map<int, std::string> list_devices_response_ = {};
+  std::vector<std::string> list_properties_response_ = {};
+
+  std::unique_ptr<MockGesturePropertiesService> mock_service_;
+
+  std::unique_ptr<GesturePropertiesServiceProvider> service_provider_;
+  chromeos::ServiceProviderTestHelper test_helper_;
+
+  DISALLOW_COPY_AND_ASSIGN(GesturePropertiesServiceProviderTest);
+};
+
+TEST_F(GesturePropertiesServiceProviderTest, ListDevicesEmpty) {
+  list_devices_response_ = {};
+  EXPECT_CALL(*mock_service_, ListDevices(_));
+
+  std::unique_ptr<dbus::Response> response = nullptr;
+  CallWithoutParameters(chromeos::kGesturePropertiesServiceListDevicesMethod,
+                        response);
+
+  dbus::MessageReader reader(response.get());
+  EXPECT_EQ(0u, expect_uint32(&reader));
+  dbus::MessageReader array_reader(nullptr);
+  ASSERT_TRUE(reader.PopArray(&array_reader));
+  EXPECT_FALSE(array_reader.HasMoreData());
+  EXPECT_FALSE(reader.HasMoreData());
+}
+
+TEST_F(GesturePropertiesServiceProviderTest, ListDevicesSuccess) {
+  list_devices_response_ = {
+      {4, "dev 1"},
+      {7, "dev 2"},
+  };
+  EXPECT_CALL(*mock_service_, ListDevices(_));
+
+  std::unique_ptr<dbus::Response> response = nullptr;
+  CallWithoutParameters(chromeos::kGesturePropertiesServiceListDevicesMethod,
+                        response);
+
+  dbus::MessageReader reader(response.get());
+  EXPECT_EQ(2u, expect_uint32(&reader));
+  dbus::MessageReader array_reader(nullptr);
+  ASSERT_TRUE(reader.PopArray(&array_reader));
+
+  dbus::MessageReader dict_entry_reader(nullptr);
+  ASSERT_TRUE(array_reader.PopDictEntry(&dict_entry_reader));
+  EXPECT_EQ(4, expect_int32(&dict_entry_reader));
+  EXPECT_EQ("dev 1", expect_string(&dict_entry_reader));
+
+  ASSERT_TRUE(array_reader.PopDictEntry(&dict_entry_reader));
+  EXPECT_EQ(7, expect_int32(&dict_entry_reader));
+  EXPECT_EQ("dev 2", expect_string(&dict_entry_reader));
+
+  EXPECT_FALSE(array_reader.HasMoreData());
+  EXPECT_FALSE(reader.HasMoreData());
+}
+
+}  // namespace ash
diff --git a/ash/dbus/org.chromium.GesturePropertiesService.conf b/ash/dbus/org.chromium.GesturePropertiesService.conf
new file mode 100644
index 0000000..b1a369c4
--- /dev/null
+++ b/ash/dbus/org.chromium.GesturePropertiesService.conf
@@ -0,0 +1,20 @@
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+  "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<!--
+  Copyright 2019 The Chromium Authors. All rights reserved.
+  Use of this source code is governed by a BSD-style license that can be
+  found in the LICENSE file.
+
+  This file will be installed at /opt/google/chrome/dbus on Chrome OS.
+-->
+<busconfig>
+  <policy user="chronos">
+    <allow own="org.chromium.GesturePropertiesService"/>
+  </policy>
+
+  <policy user="chronos">
+    <allow send_destination="org.chromium.GesturePropertiesService"
+           send_interface="org.chromium.GesturePropertiesServiceInterface"/>
+  </policy>
+
+</busconfig>
diff --git a/ash/display/cros_display_config.cc b/ash/display/cros_display_config.cc
index 98015d5..758b5c2 100644
--- a/ash/display/cros_display_config.cc
+++ b/ash/display/cros_display_config.cc
@@ -22,7 +22,7 @@
 #include "ui/display/display_layout_builder.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/manager/display_util.h"
-#include "ui/display/mojo/display_struct_traits.h"
+#include "ui/display/mojom/display_mojom_traits.h"
 #include "ui/display/screen.h"
 
 namespace ash {
diff --git a/ash/keyboard/keyboard_controller_impl.cc b/ash/keyboard/keyboard_controller_impl.cc
index bf7d8d60..70fa3bfd6 100644
--- a/ash/keyboard/keyboard_controller_impl.cc
+++ b/ash/keyboard/keyboard_controller_impl.cc
@@ -79,11 +79,6 @@
     observer.OnKeyboardVisibleBoundsChanged(screen_bounds);
 }
 
-void KeyboardControllerImpl::SendOnLoadKeyboardContentsRequested() {
-  for (auto& observer : observers_)
-    observer.OnLoadKeyboardContentsRequested();
-}
-
 void KeyboardControllerImpl::SendOnKeyboardUIDestroyed() {
   for (auto& observer : observers_)
     observer.OnKeyboardUIDestroyed();
@@ -91,10 +86,6 @@
 
 // ash::KeyboardController
 
-void KeyboardControllerImpl::KeyboardContentsLoaded(const gfx::Size& size) {
-  keyboard_ui_controller()->KeyboardContentsLoaded(size);
-}
-
 keyboard::KeyboardConfig KeyboardControllerImpl::GetKeyboardConfig() {
   return keyboard_ui_controller_->keyboard_config();
 }
diff --git a/ash/keyboard/keyboard_controller_impl.h b/ash/keyboard/keyboard_controller_impl.h
index 37430b1d..584c7f7 100644
--- a/ash/keyboard/keyboard_controller_impl.h
+++ b/ash/keyboard/keyboard_controller_impl.h
@@ -54,11 +54,9 @@
 
   // Forwards events to observers.
   void SendOnKeyboardVisibleBoundsChanged(const gfx::Rect& screen_bounds);
-  void SendOnLoadKeyboardContentsRequested();
   void SendOnKeyboardUIDestroyed();
 
   // ash::KeyboardController:
-  void KeyboardContentsLoaded(const gfx::Size& size) override;
   keyboard::KeyboardConfig GetKeyboardConfig() override;
   void SetKeyboardConfig(
       const keyboard::KeyboardConfig& keyboard_config) override;
diff --git a/ash/keyboard/ui/keyboard_ui.cc b/ash/keyboard/ui/keyboard_ui.cc
index 173aab1..3473649 100644
--- a/ash/keyboard/ui/keyboard_ui.cc
+++ b/ash/keyboard/ui/keyboard_ui.cc
@@ -35,11 +35,6 @@
     window->Hide();
 }
 
-void KeyboardUI::KeyboardContentsLoaded(const gfx::Size& size) {
-  NOTREACHED() << "Unexpected call to KeyboardContentsLoaded. Size: "
-               << size.ToString();
-}
-
 void KeyboardUI::SetController(KeyboardUIController* controller) {
   keyboard_controller_ = controller;
 }
diff --git a/ash/keyboard/ui/keyboard_ui.h b/ash/keyboard/ui/keyboard_ui.h
index 4c8065e..7c2874c9 100644
--- a/ash/keyboard/ui/keyboard_ui.h
+++ b/ash/keyboard/ui/keyboard_ui.h
@@ -13,9 +13,6 @@
 namespace aura {
 class Window;
 }
-namespace gfx {
-class Size;
-}
 namespace ui {
 class InputMethod;
 }
@@ -70,8 +67,6 @@
   // TODO(https://crbug.com/845780): Change this to accept a callback.
   virtual void ReloadKeyboardIfNeeded() = 0;
 
-  virtual void KeyboardContentsLoaded(const gfx::Size& size);
-
   // |controller| may be null when KeyboardUIController is being destroyed.
   void SetController(KeyboardUIController* controller);
 
diff --git a/ash/keyboard/ui/keyboard_ui_controller.cc b/ash/keyboard/ui/keyboard_ui_controller.cc
index 505464a..c9c497b5 100644
--- a/ash/keyboard/ui/keyboard_ui_controller.cc
+++ b/ash/keyboard/ui/keyboard_ui_controller.cc
@@ -1060,12 +1060,6 @@
   return false;
 }
 
-void KeyboardUIController::KeyboardContentsLoaded(const gfx::Size& size) {
-  if (!IsEnabled())
-    return;
-  ui_->KeyboardContentsLoaded(size);
-}
-
 ui::TextInputClient* KeyboardUIController::GetTextInputClient() {
   return ui_->GetInputMethod()->GetTextInputClient();
 }
diff --git a/ash/keyboard/ui/keyboard_ui_controller.h b/ash/keyboard/ui/keyboard_ui_controller.h
index 07ff340..b6f4e4d8 100644
--- a/ash/keyboard/ui/keyboard_ui_controller.h
+++ b/ash/keyboard/ui/keyboard_ui_controller.h
@@ -223,7 +223,7 @@
 
   bool IsKeyboardVisible();
 
-  void KeyboardContentsLoaded(const gfx::Size& size);
+  void KeyboardContentsLoaded();
 
   aura::Window* parent_container() { return parent_container_; }
 
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index 6523878..d35e576 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -1252,9 +1252,19 @@
 
   main_view_->AddChildView(primary_big_view_);
 
-  // Build media controls view.
+  // Build media controls view. Using base::Unretained(this) is safe here
+  // because these callbacks are used by |media_controls_view_|, which is
+  // owned by |this|.
+  LockScreenMediaControlsView::Callbacks media_controls_callbacks;
+  media_controls_callbacks.media_controls_enabled = base::BindRepeating(
+      &LockContentsView::AreMediaControlsEnabled, base::Unretained(this));
+  media_controls_callbacks.hide_media_controls = base::BindRepeating(
+      &LockContentsView::HideMediaControlsLayout, base::Unretained(this));
+  media_controls_callbacks.show_media_controls = base::BindRepeating(
+      &LockContentsView::CreateMediaControlsLayout, base::Unretained(this));
+
   media_controls_view_ = std::make_unique<LockScreenMediaControlsView>(
-      Shell::Get()->connector(), this);
+      Shell::Get()->connector(), media_controls_callbacks);
   media_controls_view_->set_owned_by_client();
 
   if (users.size() > 1) {
diff --git a/ash/login/ui/lock_screen_media_controls_view.cc b/ash/login/ui/lock_screen_media_controls_view.cc
index 9302e919..20e2ff7ef 100644
--- a/ash/login/ui/lock_screen_media_controls_view.cc
+++ b/ash/login/ui/lock_screen_media_controls_view.cc
@@ -110,12 +110,22 @@
 
 }  // namespace
 
+LockScreenMediaControlsView::Callbacks::Callbacks() = default;
+
+LockScreenMediaControlsView::Callbacks::~Callbacks() = default;
+
 LockScreenMediaControlsView::LockScreenMediaControlsView(
     service_manager::Connector* connector,
-    LockContentsView* view)
-    : view_(view),
-      connector_(connector),
-      hide_controls_timer_(new base::OneShotTimer()) {
+    const Callbacks& callbacks)
+    : connector_(connector),
+      hide_controls_timer_(new base::OneShotTimer()),
+      media_controls_enabled_(callbacks.media_controls_enabled),
+      hide_media_controls_(callbacks.hide_media_controls),
+      show_media_controls_(callbacks.show_media_controls) {
+  DCHECK(callbacks.media_controls_enabled);
+  DCHECK(callbacks.hide_media_controls);
+  DCHECK(callbacks.show_media_controls);
+
   SetBackground(views::CreateRoundedRectBackground(kMediaControlsBackground,
                                                    kMediaControlsCornerRadius));
   middle_spacing_ = std::make_unique<NonAccessibleView>();
@@ -253,20 +263,22 @@
 
   // If controls aren't enabled or there is no session to show, don't show the
   // controls.
-  if (!view_->AreMediaControlsEnabled() || !session_info) {
-    view_->HideMediaControlsLayout();
+  if (!media_controls_enabled_.Run() || !session_info) {
+    hide_media_controls_.Run();
   } else if (!IsDrawn() &&
              session_info->playback_state ==
                  media_session::mojom::MediaPlaybackState::kPaused) {
     // If the screen is locked while media is paused, don't show the controls.
-    view_->HideMediaControlsLayout();
+    hide_media_controls_.Run();
   } else if (!IsDrawn()) {
-    view_->CreateMediaControlsLayout();
+    show_media_controls_.Run();
   }
 
-  SetIsPlaying(session_info &&
-               session_info->playback_state ==
-                   media_session::mojom::MediaPlaybackState::kPlaying);
+  if (IsDrawn()) {
+    SetIsPlaying(session_info &&
+                 session_info->playback_state ==
+                     media_session::mojom::MediaPlaybackState::kPlaying);
+  }
 }
 
 void LockScreenMediaControlsView::MediaSessionMetadataChanged(
@@ -308,10 +320,8 @@
   // If there is no current session but there was a previous one, wait to see
   // if a new session starts before hiding the controls.
   if (!request_id.has_value() && media_session_id_.has_value()) {
-    hide_controls_timer_->Start(
-        FROM_HERE, kNextMediaDelay,
-        base::BindOnce(&LockContentsView::HideMediaControlsLayout,
-                       base::Unretained(view_)));
+    hide_controls_timer_->Start(FROM_HERE, kNextMediaDelay,
+                                hide_media_controls_);
   }
 
   media_session_id_ = request_id;
diff --git a/ash/login/ui/lock_screen_media_controls_view.h b/ash/login/ui/lock_screen_media_controls_view.h
index 6c134d39..ac56adb 100644
--- a/ash/login/ui/lock_screen_media_controls_view.h
+++ b/ash/login/ui/lock_screen_media_controls_view.h
@@ -25,7 +25,6 @@
 
 namespace ash {
 
-class LockContentsView;
 class MediaControlsHeaderView;
 class NonAccessibleView;
 
@@ -35,8 +34,27 @@
       public media_session::mojom::MediaControllerImageObserver,
       public views::ButtonListener {
  public:
+  using MediaControlsEnabled = base::RepeatingCallback<bool()>;
+
+  struct Callbacks {
+    Callbacks();
+    ~Callbacks();
+
+    // Called in |MediaSessionInfoChanged| to determine the visibility of the
+    // media controls.
+    MediaControlsEnabled media_controls_enabled;
+
+    // Called when the controls should be hidden on the lock screen.
+    base::RepeatingClosure hide_media_controls;
+
+    // Called when the controls should be drawn on the lock screen.
+    base::RepeatingClosure show_media_controls;
+
+    DISALLOW_COPY_AND_ASSIGN(Callbacks);
+  };
+
   LockScreenMediaControlsView(service_manager::Connector* connector,
-                              LockContentsView* view);
+                              const Callbacks& callbacks);
   ~LockScreenMediaControlsView() override;
 
   // views::View:
@@ -96,9 +114,6 @@
   // necessary.
   void SetIsPlaying(bool playing);
 
-  // Lock screen view which this view belongs to.
-  LockContentsView* const view_;
-
   // Used to connect to the Media Session service.
   service_manager::Connector* const connector_;
 
@@ -140,6 +155,11 @@
   NonAccessibleView* button_row_ = nullptr;
   views::ToggleImageButton* play_pause_button_ = nullptr;
 
+  // Callbacks.
+  const MediaControlsEnabled media_controls_enabled_;
+  const base::RepeatingClosure hide_media_controls_;
+  const base::RepeatingClosure show_media_controls_;
+
   DISALLOW_COPY_AND_ASSIGN(LockScreenMediaControlsView);
 };
 
diff --git a/ash/media/media_notification_container_impl.cc b/ash/media/media_notification_container_impl.cc
index 0c8effc..6b98d13 100644
--- a/ash/media/media_notification_container_impl.cc
+++ b/ash/media/media_notification_container_impl.cc
@@ -60,6 +60,7 @@
 
 void MediaNotificationContainerImpl::UpdateCornerRadius(int top_radius,
                                                         int bottom_radius) {
+  MessageView::SetCornerRadius(top_radius, bottom_radius);
   view_.UpdateCornerRadius(top_radius, bottom_radius);
 }
 
diff --git a/ash/public/cpp/app_list/app_list_types.h b/ash/public/cpp/app_list/app_list_types.h
index 48149570..415e66e0 100644
--- a/ash/public/cpp/app_list/app_list_types.h
+++ b/ash/public/cpp/app_list/app_list_types.h
@@ -143,7 +143,7 @@
 enum SearchResultDisplayLocation {
   kSuggestionChipContainer,
   kTileListContainer,
-  kUnknown,
+  kPlacementUndefined,
 };
 
 // Which index in the UI container should the result be placed in.
@@ -154,7 +154,7 @@
   kFourthIndex,
   kFifthIndex,
   kSixthIndex,
-  kPlacementUndefined,
+  kUndefined,
 };
 
 // Actions for OmniBox zero state suggestion.
@@ -261,11 +261,10 @@
 
   // Which UI container should the result be displayed in.
   SearchResultDisplayLocation display_location =
-      SearchResultDisplayLocation::kUnknown;
+      SearchResultDisplayLocation::kPlacementUndefined;
 
   // Which index in the UI container should the result be placed in.
-  SearchResultDisplayIndex display_index =
-      SearchResultDisplayIndex::kPlacementUndefined;
+  SearchResultDisplayIndex display_index = SearchResultDisplayIndex::kUndefined;
 
   // A score to determine the result display order.
   double display_score = 0;
diff --git a/ash/public/cpp/keyboard/keyboard_controller.h b/ash/public/cpp/keyboard/keyboard_controller.h
index 6a2de18..8bdb7c5 100644
--- a/ash/public/cpp/keyboard/keyboard_controller.h
+++ b/ash/public/cpp/keyboard/keyboard_controller.h
@@ -36,9 +36,6 @@
 
   virtual ~KeyboardController();
 
-  // Informs the controller that the keyboard contents have loaded.
-  virtual void KeyboardContentsLoaded(const gfx::Size& size) = 0;
-
   // Retrieves the current keyboard configuration.
   virtual keyboard::KeyboardConfig GetKeyboardConfig() = 0;
 
diff --git a/ash/public/cpp/test/test_keyboard_controller_observer.cc b/ash/public/cpp/test/test_keyboard_controller_observer.cc
index daeac0d..27a96ae 100644
--- a/ash/public/cpp/test/test_keyboard_controller_observer.cc
+++ b/ash/public/cpp/test/test_keyboard_controller_observer.cc
@@ -40,10 +40,6 @@
 void TestKeyboardControllerObserver::OnKeyboardOccludedBoundsChanged(
     const gfx::Rect& bounds) {}
 
-void TestKeyboardControllerObserver::OnLoadKeyboardContentsRequested() {
-  controller_->KeyboardContentsLoaded(gfx::Size(100, 100));
-}
-
 void TestKeyboardControllerObserver::OnKeyboardUIDestroyed() {}
 
 }  // namespace ash
diff --git a/ash/public/cpp/test/test_keyboard_controller_observer.h b/ash/public/cpp/test/test_keyboard_controller_observer.h
index 55cab7c..4c57819 100644
--- a/ash/public/cpp/test/test_keyboard_controller_observer.h
+++ b/ash/public/cpp/test/test_keyboard_controller_observer.h
@@ -29,7 +29,6 @@
   void OnKeyboardVisibilityChanged(bool visible) override;
   void OnKeyboardVisibleBoundsChanged(const gfx::Rect& bounds) override;
   void OnKeyboardOccludedBoundsChanged(const gfx::Rect& bounds) override;
-  void OnLoadKeyboardContentsRequested() override;
   void OnKeyboardUIDestroyed() override;
 
   const keyboard::KeyboardConfig& config() const { return config_; }
diff --git a/ash/public/interfaces/BUILD.gn b/ash/public/interfaces/BUILD.gn
index 0702956..cadacf6 100644
--- a/ash/public/interfaces/BUILD.gn
+++ b/ash/public/interfaces/BUILD.gn
@@ -30,7 +30,7 @@
     "//skia/public/interfaces",
     "//ui/base/ime/chromeos/public/interfaces",
     "//ui/base/mojom",
-    "//ui/display/mojo:interfaces",
+    "//ui/display/mojom:mojom",
     "//ui/gfx/geometry/mojo",
     "//ui/gfx/image/mojo:interfaces",
     "//ui/gfx/range/mojo",
diff --git a/ash/public/interfaces/cros_display_config.mojom b/ash/public/interfaces/cros_display_config.mojom
index ac2899a1..5be4f56 100644
--- a/ash/public/interfaces/cros_display_config.mojom
+++ b/ash/public/interfaces/cros_display_config.mojom
@@ -5,7 +5,7 @@
 module ash.mojom;
 
 import "ui/gfx/geometry/mojo/geometry.mojom";
-import "ui/display/mojo/display.mojom";
+import "ui/display/mojom/display.mojom";
 
 // All points, bounds, and insets are in display pixels unless otherwise
 // sepcified.
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index bb6cbdb..eaef353 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -8,7 +8,6 @@
 #include <functional>
 #include <utility>
 
-#include "ash/kiosk_next/kiosk_next_shell_controller_impl.h"
 #include "ash/metrics/histogram_macros.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/fps_counter.h"
@@ -864,11 +863,6 @@
 }
 
 bool OverviewGrid::ShouldAnimateWallpaper() const {
-  // Kiosk next shell mode will have an opaque background covering the wallpaper
-  // prior to entering overview, so there's no need to animate it.
-  if (Shell::Get()->kiosk_next_shell_controller()->IsEnabled())
-    return false;
-
   // Never animate when doing app dragging or when immediately exiting.
   const auto enter_exit_type = overview_session_->enter_exit_overview_type();
   if (enter_exit_type ==
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc
index 147624f..9686328 100644
--- a/ash/wm/overview/overview_item.cc
+++ b/ash/wm/overview/overview_item.cc
@@ -539,7 +539,7 @@
 
 void OverviewItem::OnSelectorItemDragStarted(OverviewItem* item) {
   is_being_dragged_ = (item == this);
-  // Disable mask and shadow for the dragged overview item during dragging.
+  // Disable shadow for the dragged overview item during dragging.
   if (is_being_dragged_)
     UpdateRoundedCornersAndShadow();
 
@@ -555,7 +555,7 @@
     // Do nothing further with the dragged overview item if it is being snapped.
     if (snap)
       return;
-    // Re-show mask and shadow for the dragged overview item after drag ends.
+    // Re-show shadow for the dragged overview item after drag ends.
     UpdateRoundedCornersAndShadow();
   }
 
@@ -703,33 +703,33 @@
 }
 
 void OverviewItem::UpdateRoundedCornersAndShadow() {
-  // Do not show mask and shadow if:
-  // 1) overview is shutting down or
-  // 2) this overview item is in an overview grid that contains more than 10
-  //    windows. In this case don't apply rounded corner mask because it can
-  //    push the compositor memory usage to the limit. TODO(oshima): Remove
-  //    this once new rounded corner impl is available. (crbug.com/903486)
-  // 3) we're currently in entering overview animation or
-  // 4) this overview item is being dragged or
-  // 5) this overview item is the drop target window or
-  // 6) this overview item is in animation.
+  // Do not show the rounded corners and the shadow if overview is shutting down
+  // or we're currently in entering overview animation.
   bool should_show = true;
   OverviewController* overview_controller = Shell::Get()->overview_controller();
   if (disable_mask_ || !overview_controller ||
       !overview_controller->InOverviewSession() ||
-      overview_controller->IsInStartAnimation() || is_being_dragged_ ||
-      overview_grid_->IsDropTargetWindow(GetWindow()) ||
-      transform_window_.GetOverviewWindow()
-          ->layer()
-          ->GetAnimator()
-          ->is_animating()) {
+      overview_controller->IsInStartAnimation()) {
     should_show = false;
   }
 
-  transform_window_.UpdateMask(should_show);
-  SetShadowBounds(should_show ? base::make_optional(gfx::ToEnclosedRect(
-                                    transform_window_.GetTransformedBounds()))
-                              : base::nullopt);
+  // In addition, the shadow should be hidden if
+  // 1) this overview item is being dragged or
+  // 2) this overview item is the drop target window or
+  // 3) this overview item is in animation.
+  const bool should_show_shadow =
+      should_show && !is_being_dragged_ &&
+      !overview_grid_->IsDropTargetWindow(GetWindow()) &&
+      !transform_window_.GetOverviewWindow()
+           ->layer()
+           ->GetAnimator()
+           ->is_animating();
+
+  transform_window_.UpdateRoundedCorners(should_show);
+  SetShadowBounds(should_show_shadow
+                      ? base::make_optional(gfx::ToEnclosedRect(
+                            transform_window_.GetTransformedBounds()))
+                      : base::nullopt);
   if (transform_window_.IsMinimized()) {
     caption_container_view_->UpdatePreviewRoundedCorners(
         should_show, kOverviewWindowRoundingDp);
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc
index 08df7d5..4a80f212 100644
--- a/ash/wm/overview/overview_session_unittest.cc
+++ b/ash/wm/overview/overview_session_unittest.cc
@@ -2683,7 +2683,7 @@
 
 // Test that the mask that is applied to add rounded corners in overview mode
 // is removed during drags.
-TEST_F(OverviewSessionRoundedCornerTest, RoundedEdgeMaskVisibilityDragging) {
+TEST_F(OverviewSessionRoundedCornerTest, ShadowVisibilityDragging) {
   std::unique_ptr<aura::Window> window1(CreateTestWindow());
   std::unique_ptr<aura::Window> window2(CreateTestWindow());
 
@@ -2697,8 +2697,8 @@
   ui::ScopedAnimationDurationScaleMode test_duration_mode(
       ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
 
-  // Drag the first window. Verify that the mask was removed for the first
-  // window but still exists for the second window as we do not apply mask
+  // Drag the first window. Verify that the shadow was removed for the first
+  // window but still exists for the second window as we do not make shadow
   // for a dragged window.
   const gfx::Point start_drag =
       gfx::ToRoundedPoint(item1->target_bounds().CenterPoint());
@@ -2708,25 +2708,31 @@
   EXPECT_FALSE(window1->layer()->GetAnimator()->is_animating());
   EXPECT_FALSE(window2->layer()->GetAnimator()->is_animating());
 
-  EXPECT_FALSE(HasRoundedCorner(item1));
-  EXPECT_TRUE(HasRoundedCorner(item2));
+  EXPECT_TRUE(item1->GetShadowBoundsForTesting().IsEmpty());
+  EXPECT_FALSE(item2->GetShadowBoundsForTesting().IsEmpty());
 
   // Drag to horizontally and then back to the start to avoid activating the
-  // window, drag to close or entering splitview. Verify that the mask is
+  // window, drag to close or entering splitview. Verify that the shadow is
   // invisible on both items during animation.
   generator->MoveMouseTo(gfx::Point(0, start_drag.y()));
+
+  // The drop target window should be created with no shadow.
+  OverviewItem* drop_target_item = GetDropTarget(0);
+  ASSERT_TRUE(drop_target_item);
+  EXPECT_TRUE(drop_target_item->GetShadowBoundsForTesting().IsEmpty());
+
   generator->MoveMouseTo(start_drag);
   generator->ReleaseLeftButton();
   EXPECT_TRUE(window1->layer()->GetAnimator()->is_animating());
   EXPECT_TRUE(window2->layer()->GetAnimator()->is_animating());
-  EXPECT_FALSE(HasRoundedCorner(item1));
-  EXPECT_FALSE(HasRoundedCorner(item2));
+  EXPECT_TRUE(item1->GetShadowBoundsForTesting().IsEmpty());
+  EXPECT_TRUE(item2->GetShadowBoundsForTesting().IsEmpty());
 
-  // Verify that the mask is visble again after animation is finished.
+  // Verify that the shadow is visble again after animation is finished.
   window1->layer()->GetAnimator()->StopAnimating();
   window2->layer()->GetAnimator()->StopAnimating();
-  EXPECT_TRUE(HasRoundedCorner(item1));
-  EXPECT_TRUE(HasRoundedCorner(item2));
+  EXPECT_FALSE(item1->GetShadowBoundsForTesting().IsEmpty());
+  EXPECT_FALSE(item2->GetShadowBoundsForTesting().IsEmpty());
 }
 
 // Tests that the shadows in overview mode are placed correctly.
diff --git a/ash/wm/overview/scoped_overview_transform_window.cc b/ash/wm/overview/scoped_overview_transform_window.cc
index 8f8c9922..c47a7504 100644
--- a/ash/wm/overview/scoped_overview_transform_window.cc
+++ b/ash/wm/overview/scoped_overview_transform_window.cc
@@ -137,7 +137,7 @@
     targeting_policy_map_.erase(it);
   }
 
-  UpdateMask(/*show=*/false);
+  UpdateRoundedCorners(/*show=*/false);
   StopObservingImplicitAnimations();
   aura::client::GetTransientWindowClient()->RemoveObserver(this);
   window_->layer()->SetClipRect(original_clip_rect_);
@@ -379,9 +379,7 @@
   overview_bounds_.reset();
 }
 
-// TODO(sammiequon): Investigate if waiting till the end of the animation to set
-// these properties is still required.
-void ScopedOverviewTransformWindow::UpdateMask(bool show) {
+void ScopedOverviewTransformWindow::UpdateRoundedCorners(bool show) {
   // Minimized windows have their corners rounded in CaptionContainerView.
   if (IsMinimized())
     return;
@@ -410,9 +408,11 @@
 
 void ScopedOverviewTransformWindow::OnLayerAnimationStarted(
     ui::LayerAnimationSequence* sequence) {
-  // Remove the mask before animating because masks affect animation
-  // performance. The mask will be added back once the animation is completed.
-  overview_item_->UpdateRoundedCornersAndShadow();
+  // Remove the shadow before animating because it may affect animation
+  // performance. The shadow will be added back once the animation is completed.
+  // Note that we can't use UpdateRoundedCornersAndShadow() since we don't want
+  // to update the rounded corners.
+  overview_item_->SetShadowBounds(base::nullopt);
 }
 
 void ScopedOverviewTransformWindow::OnImplicitAnimationsCompleted() {
diff --git a/ash/wm/overview/scoped_overview_transform_window.h b/ash/wm/overview/scoped_overview_transform_window.h
index fa9068e..20c00aa 100644
--- a/ash/wm/overview/scoped_overview_transform_window.h
+++ b/ash/wm/overview/scoped_overview_transform_window.h
@@ -146,9 +146,9 @@
   // change. Must be called before PositionWindows in OverviewGrid.
   void UpdateWindowDimensionsType();
 
-  // Updates the mask which gives rounded corners on the windows. Shows the mask
-  // if |show| is true, otherwise removes it.
-  void UpdateMask(bool show);
+  // Updates the rounded corners on the window. Makes the rounded corners if
+  // |show| is true, otherwise removes it.
+  void UpdateRoundedCorners(bool show);
 
   // Stop listening to any animations to finish.
   void CancelAnimationsListener();
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc
index 2923cb0..f3e577fb 100644
--- a/ash/wm/splitview/split_view_controller_unittest.cc
+++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -13,11 +13,8 @@
 #include "ash/app_list/app_list_controller_impl.h"
 #include "ash/display/screen_orientation_controller.h"
 #include "ash/display/screen_orientation_controller_test_api.h"
-#include "ash/kiosk_next/kiosk_next_shell_test_util.h"
-#include "ash/kiosk_next/mock_kiosk_next_shell_client.h"
 #include "ash/magnifier/docked_magnifier_controller_impl.h"
 #include "ash/public/cpp/app_types.h"
-#include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/fps_counter.h"
 #include "ash/public/cpp/presentation_time_recorder.h"
 #include "ash/public/cpp/window_properties.h"
@@ -52,7 +49,6 @@
 #include "ash/wm/wm_event.h"
 #include "base/stl_util.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_feature_list.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/test/test_window_delegate.h"
 #include "ui/aura/test/test_windows.h"
@@ -4602,76 +4598,4 @@
   EXPECT_EQ(backdrop_window->bounds(), active_desk_container->bounds());
 }
 
-class SplitViewKioskNextAppDraggingTest : public SplitViewAppDraggingTest {
- public:
-  SplitViewKioskNextAppDraggingTest() = default;
-  ~SplitViewKioskNextAppDraggingTest() override = default;
-
-  // SplitViewAppDraggingTest:
-  void SetUp() override {
-    scoped_feature_list_.InitAndEnableFeature(features::kKioskNextShell);
-    set_start_session(false);
-
-    SplitViewAppDraggingTest::SetUp();
-
-    client_ = std::make_unique<MockKioskNextShellClient>();
-    LogInKioskNextUser(GetSessionControllerClient());
-  }
-
-  void TearDown() override {
-    client_.reset();
-    SplitViewAppDraggingTest::TearDown();
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-  std::unique_ptr<MockKioskNextShellClient> client_;
-
-  DISALLOW_COPY_AND_ASSIGN(SplitViewKioskNextAppDraggingTest);
-};
-
-// Tests that split view is disabled in Kiosk Next sessions.
-TEST_F(SplitViewKioskNextAppDraggingTest, SplitViewDisabled) {
-  std::unique_ptr<aura::Window> window(CreateWindow(gfx::Rect(0, 0, 400, 400)));
-
-  EXPECT_FALSE(ShouldAllowSplitView());
-  EXPECT_FALSE(CanSnapInSplitview(window.get()));
-}
-
-// Tests that dragging a maximized window doesn't show drag indicators or allow
-// snapping in Kiosk Next sessions.
-TEST_F(SplitViewKioskNextAppDraggingTest, DragMaximizedWindow) {
-  UpdateDisplay("800x600");
-  InitializeWindow();
-  EXPECT_TRUE(wm::GetWindowState(window())->IsMaximized());
-  gfx::Rect display_bounds =
-      screen_util::GetDisplayWorkAreaBoundsInScreenForActiveDeskContainer(
-          window());
-
-  // Move the window by a small amount of distance will maximize the window
-  // again.
-  gfx::Point location(0, 10);
-  SendGestureEvents(location);
-  EXPECT_TRUE(wm::GetWindowState(window())->IsMaximized());
-
-  // Drag the window down to trigger overview mode.
-  const float long_scroll_delta = display_bounds.height() / 4 + 5;
-  location.set_y(long_scroll_delta);
-  SendScrollStartAndUpdate(location);
-  OverviewController* overview_controller = Shell::Get()->overview_controller();
-  EXPECT_TRUE(overview_controller->InOverviewSession());
-  EXPECT_FALSE(
-      overview_controller->overview_session()->IsWindowInOverview(window()));
-
-  // No drag indicators.
-  EXPECT_EQ(IndicatorState::kNone, GetIndicatorState());
-
-  // Complete the drag and verify the window is not snapped.
-  EndScrollSequence();
-  EXPECT_TRUE(overview_controller->InOverviewSession());
-  EXPECT_EQ(IndicatorState::kNone, GetIndicatorState());
-  EXPECT_FALSE(split_view_controller()->InSplitViewMode());
-  EXPECT_FALSE(wm::GetWindowState(window())->IsSnapped());
-}
-
 }  // namespace ash
diff --git a/ash/wm/splitview/split_view_utils.cc b/ash/wm/splitview/split_view_utils.cc
index bdd00e4..c0b969a 100644
--- a/ash/wm/splitview/split_view_utils.cc
+++ b/ash/wm/splitview/split_view_utils.cc
@@ -6,7 +6,6 @@
 
 #include "ash/accessibility/accessibility_controller_impl.h"
 #include "ash/display/screen_orientation_controller.h"
-#include "ash/kiosk_next/kiosk_next_shell_controller_impl.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/toast_data.h"
@@ -248,10 +247,6 @@
   if (Shell::Get()->screen_pinning_controller()->IsPinned())
     return false;
 
-  // Don't allow split view in Kiosk Next.
-  if (Shell::Get()->kiosk_next_shell_controller()->IsEnabled())
-    return false;
-
   // TODO(crubg.com/853588): Disallow window dragging and split screen while
   // ChromeVox is on until they are in a usable state.
   if (Shell::Get()->accessibility_controller()->spoken_feedback_enabled())
diff --git a/base/files/file_descriptor_watcher_posix.cc b/base/files/file_descriptor_watcher_posix.cc
index f43a7d9..04579d1a 100644
--- a/base/files/file_descriptor_watcher_posix.cc
+++ b/base/files/file_descriptor_watcher_posix.cc
@@ -174,7 +174,7 @@
     // thread. This ensures that the file descriptor is never accessed after
     // this destructor returns.
     //
-    // Use a ScopedClosureRunner to ensure that |done| is signalled even if the
+    // Use a ScopedClosureRunner to ensure that |done| is signaled even if the
     // thread doesn't run any more tasks (if PostTask returns true, it means
     // that the task was queued, but it doesn't mean that a RunLoop will run the
     // task before the queue is deleted).
diff --git a/base/files/file_descriptor_watcher_posix.h b/base/files/file_descriptor_watcher_posix.h
index d89d000c..6eff314 100644
--- a/base/files/file_descriptor_watcher_posix.h
+++ b/base/files/file_descriptor_watcher_posix.h
@@ -97,11 +97,16 @@
   // Registers |callback| to be posted on the current sequence when |fd| is
   // readable or writable without blocking. |callback| is unregistered when the
   // returned Controller is deleted (deletion must happen on the current
-  // sequence). To call these methods, a FileDescriptorWatcher must have been
+  // sequence).
+  // Usage note: To call these methods, a FileDescriptorWatcher must have been
   // instantiated on the current thread and SequencedTaskRunnerHandle::IsSet()
   // must return true (these conditions are met at least on all ThreadPool
   // threads as well as on threads backed by a MessageLoopForIO). |fd| must
   // outlive the returned Controller.
+  // Shutdown note: notifications aren't guaranteed to be emitted once the bound
+  // (current) SequencedTaskRunner enters its shutdown phase (i.e.
+  // ThreadPool::Shutdown() or Thread::Stop()) regardless of the
+  // SequencedTaskRunner's TaskShutdownBehavior.
   static std::unique_ptr<Controller> WatchReadable(
       int fd,
       const RepeatingClosure& callback);
diff --git a/base/memory/weak_ptr.h b/base/memory/weak_ptr.h
index af2bd38..72b5f1f 100644
--- a/base/memory/weak_ptr.h
+++ b/base/memory/weak_ptr.h
@@ -16,14 +16,13 @@
 //
 //  class Controller {
 //   public:
-//    Controller() : weak_factory_(this) {}
 //    void SpawnWorker() { Worker::StartNew(weak_factory_.GetWeakPtr()); }
 //    void WorkComplete(const Result& result) { ... }
 //   private:
 //    // Member variables should appear before the WeakPtrFactory, to ensure
 //    // that any WeakPtrs to Controller are invalidated before its members
 //    // variable's destructors are executed, rendering them invalid.
-//    WeakPtrFactory<Controller> weak_factory_;
+//    WeakPtrFactory<Controller> weak_factory_{this};
 //  };
 //
 //  class Worker {
diff --git a/base/task/sequence_manager/sequence_manager_impl_unittest.cc b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
index 5bc38cc..d257d85 100644
--- a/base/task/sequence_manager/sequence_manager_impl_unittest.cc
+++ b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
@@ -73,6 +73,8 @@
 // To avoid symbol collisions in jumbo builds.
 namespace sequence_manager_impl_unittest {
 
+constexpr TimeDelta kDelay = TimeDelta::FromSeconds(42);
+
 enum class TestType {
   kMockTaskRunner,
   kMessageLoop,
@@ -4762,132 +4764,129 @@
 
 }  // namespace
 
-TEST_P(SequenceManagerTest, LastUnblockEnqueueOrder_WithFence) {
-  constexpr TimeDelta kDelay = TimeDelta::FromSeconds(42);
-
-  {
-    // Post a task. Install a fence at the beginning of time and remove it. The
-    // task's EnqueueOrder should be less than GetLastUnblockEnqueueOrder().
-    auto queue = CreateTaskQueue();
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    queue->InsertFence(TaskQueue::InsertFencePosition::kBeginningOfTime);
-    queue->RemoveFence();
-    auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder());
-  }
-
-  {
-    // Post a 1st task. Install a now fence. Post a 2nd task. Run the first
-    // task. Remove the fence. The 2nd task's EnqueueOrder should be less than
-    // GetLastUnblockEnqueueOrder().
-    auto queue = CreateTaskQueue();
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
-    queue->RemoveFence();
-    auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder());
-  }
-
-  {
-    // Post a 1st task. Install a now fence. Post a 2nd task. Remove the fence.
-    // GetLastUnblockEnqueueOrder() should indicate that the queue was never
-    // blocked (front task could always run).
-    auto queue = CreateTaskQueue();
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    queue->RemoveFence();
-    RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
-    RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
-  }
-
-  {
-    // Post a 1st task. Install a now fence. Post a 2nd task. Install a now
-    // fence (moves the previous fence). GetLastUnblockEnqueueOrder() should
-    // indicate that the queue was never blocked (front task could always run).
-    auto queue = CreateTaskQueue();
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
-    RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
-    RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
-  }
-
-  {
-    const TimeTicks start_time = mock_tick_clock()->NowTicks();
-
-    // Post a 1st task. Install a delayed fence. Post a 2nd task that will run
-    // after the fence. Run the first task. Remove the fence. The 2nd task's
-    // EnqueueOrder should be less than GetLastUnblockEnqueueOrder().
-    auto queue =
-        CreateTaskQueue(TaskQueue::Spec("test").SetDelayedFencesAllowed(true));
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    queue->InsertFenceAt(start_time + kDelay);
-    queue->task_runner()->PostDelayedTask(FROM_HERE, DoNothing(), 2 * kDelay);
-    RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
-    FastForwardBy(2 * kDelay);
-    queue->RemoveFence();
-    auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder());
-  }
-
-  {
-    const TimeTicks start_time = mock_tick_clock()->NowTicks();
-
-    // Post a 1st task. Install a delayed fence. Post a 2nd task that will run
-    // before the fence. GetLastUnblockEnqueueOrder() should indicate that the
-    // queue was never blocked (front task could always run).
-    auto queue =
-        CreateTaskQueue(TaskQueue::Spec("test").SetDelayedFencesAllowed(true));
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    queue->InsertFenceAt(start_time + 2 * kDelay);
-    queue->task_runner()->PostDelayedTask(FROM_HERE, DoNothing(), kDelay);
-    RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
-    FastForwardBy(3 * kDelay);
-    EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
-    queue->RemoveFence();
-  }
+// Post a task. Install a fence at the beginning of time and remove it. The
+// task's EnqueueOrder should be less than GetLastUnblockEnqueueOrder().
+TEST_P(SequenceManagerTest,
+       GetLastUnblockEnqueueOrder_PostInsertFenceBeginningOfTime) {
+  auto queue = CreateTaskQueue();
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  queue->InsertFence(TaskQueue::InsertFencePosition::kBeginningOfTime);
+  queue->RemoveFence();
+  auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder());
 }
 
-TEST_P(SequenceManagerTest, LastUnblockEnqueueOrder_WithEnabled) {
-  {
-    // Post a 1st task. Disable the queue and re-enable it. Post a 2nd task. The
-    // 1st task's EnqueueOrder should be less than GetLastUnblockEnqueueOrder().
-    auto queue = CreateTaskQueue();
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    queue->GetTaskQueueImpl()->SetQueueEnabled(false);
-    queue->GetTaskQueueImpl()->SetQueueEnabled(true);
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    auto first_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_LT(first_enqueue_order, queue->GetLastUnblockEnqueueOrder());
-    auto second_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_GT(second_enqueue_order, queue->GetLastUnblockEnqueueOrder());
-  }
+// Post a 1st task. Install a now fence. Post a 2nd task. Run the first task.
+// Remove the fence. The 2nd task's EnqueueOrder should be less than
+// GetLastUnblockEnqueueOrder().
+TEST_P(SequenceManagerTest, GetLastUnblockEnqueueOrder_PostInsertNowFencePost) {
+  auto queue = CreateTaskQueue();
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
+  queue->RemoveFence();
+  auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder());
+}
 
-  {
-    // Disable the queue. Post a 1st task. Re-enable the queue. Post a 2nd task.
-    // The 1st task's EnqueueOrder should be less than
-    // GetLastUnblockEnqueueOrder().
-    auto queue = CreateTaskQueue();
-    queue->GetTaskQueueImpl()->SetQueueEnabled(false);
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    queue->GetTaskQueueImpl()->SetQueueEnabled(true);
-    queue->task_runner()->PostTask(FROM_HERE, DoNothing());
-    auto first_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_LT(first_enqueue_order, queue->GetLastUnblockEnqueueOrder());
-    auto second_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
-    EXPECT_GT(second_enqueue_order, queue->GetLastUnblockEnqueueOrder());
-  }
+// Post a 1st task. Install a now fence. Post a 2nd task. Remove the fence.
+// GetLastUnblockEnqueueOrder() should indicate that the queue was never
+// blocked (front task could always run).
+TEST_P(SequenceManagerTest,
+       GetLastUnblockEnqueueOrder_PostInsertNowFencePost2) {
+  auto queue = CreateTaskQueue();
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  queue->RemoveFence();
+  RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
+  RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
+}
+
+// Post a 1st task. Install a now fence. Post a 2nd task. Install a now fence
+// (moves the previous fence). GetLastUnblockEnqueueOrder() should indicate
+// that the queue was never blocked (front task could always run).
+TEST_P(SequenceManagerTest,
+       GetLastUnblockEnqueueOrder_PostInsertNowFencePostInsertNowFence) {
+  auto queue = CreateTaskQueue();
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
+  RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
+  RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
+}
+
+// Post a 1st task. Install a delayed fence. Post a 2nd task that will run
+// after the fence. Run the first task. Remove the fence. The 2nd task's
+// EnqueueOrder should be less than GetLastUnblockEnqueueOrder().
+TEST_P(SequenceManagerTest,
+       GetLastUnblockEnqueueOrder_PostInsertDelayedFencePostAfterFence) {
+  const TimeTicks start_time = mock_tick_clock()->NowTicks();
+  auto queue =
+      CreateTaskQueue(TaskQueue::Spec("test").SetDelayedFencesAllowed(true));
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  queue->InsertFenceAt(start_time + kDelay);
+  queue->task_runner()->PostDelayedTask(FROM_HERE, DoNothing(), 2 * kDelay);
+  RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
+  FastForwardBy(2 * kDelay);
+  queue->RemoveFence();
+  auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder());
+}
+
+// Post a 1st task. Install a delayed fence. Post a 2nd task that will run
+// before the fence. GetLastUnblockEnqueueOrder() should indicate that the
+// queue was never blocked (front task could always run).
+TEST_P(SequenceManagerTest,
+       GetLastUnblockEnqueueOrder_PostInsertDelayedFencePostBeforeFence) {
+  const TimeTicks start_time = mock_tick_clock()->NowTicks();
+  auto queue =
+      CreateTaskQueue(TaskQueue::Spec("test").SetDelayedFencesAllowed(true));
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  queue->InsertFenceAt(start_time + 2 * kDelay);
+  queue->task_runner()->PostDelayedTask(FROM_HERE, DoNothing(), kDelay);
+  RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
+  FastForwardBy(3 * kDelay);
+  EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder());
+  queue->RemoveFence();
+}
+
+// Post a 1st task. Disable the queue and re-enable it. Post a 2nd task. The 1st
+// task's EnqueueOrder should be less than GetLastUnblockEnqueueOrder().
+TEST_P(SequenceManagerTest, GetLastUnblockEnqueueOrder_PostDisablePostEnable) {
+  auto queue = CreateTaskQueue();
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  queue->GetTaskQueueImpl()->SetQueueEnabled(false);
+  queue->GetTaskQueueImpl()->SetQueueEnabled(true);
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  auto first_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_LT(first_enqueue_order, queue->GetLastUnblockEnqueueOrder());
+  auto second_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_GT(second_enqueue_order, queue->GetLastUnblockEnqueueOrder());
+}
+
+// Disable the queue. Post a 1st task. Re-enable the queue. Post a 2nd task.
+// The 1st task's EnqueueOrder should be less than
+// GetLastUnblockEnqueueOrder().
+TEST_P(SequenceManagerTest, GetLastUnblockEnqueueOrder_DisablePostEnablePost) {
+  auto queue = CreateTaskQueue();
+  queue->GetTaskQueueImpl()->SetQueueEnabled(false);
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  queue->GetTaskQueueImpl()->SetQueueEnabled(true);
+  queue->task_runner()->PostTask(FROM_HERE, DoNothing());
+  auto first_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_LT(first_enqueue_order, queue->GetLastUnblockEnqueueOrder());
+  auto second_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue);
+  EXPECT_GT(second_enqueue_order, queue->GetLastUnblockEnqueueOrder());
 }
 
 }  // namespace sequence_manager_impl_unittest
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc
index 0827e46e..64877c7 100644
--- a/base/task/sequence_manager/task_queue_impl.cc
+++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -757,27 +757,28 @@
   // Tasks posted after this point will have a strictly higher enqueue order
   // and will be blocked from running.
   main_thread_only().current_fence = current_fence;
-  bool task_unblocked =
+  bool front_task_unblocked =
       main_thread_only().immediate_work_queue->InsertFence(current_fence);
-  task_unblocked |=
+  front_task_unblocked |=
       main_thread_only().delayed_work_queue->InsertFence(current_fence);
 
   {
     base::internal::CheckedAutoLock lock(any_thread_lock_);
-    if (!task_unblocked && previous_fence && previous_fence < current_fence) {
+    if (!front_task_unblocked && previous_fence &&
+        previous_fence < current_fence) {
       if (!any_thread_.immediate_incoming_queue.empty() &&
           any_thread_.immediate_incoming_queue.front().enqueue_order() >
               previous_fence &&
           any_thread_.immediate_incoming_queue.front().enqueue_order() <
               current_fence) {
-        task_unblocked = true;
+        front_task_unblocked = true;
       }
     }
 
     UpdateCrossThreadQueueStateLocked();
   }
 
-  if (IsQueueEnabled() && task_unblocked) {
+  if (IsQueueEnabled() && front_task_unblocked) {
     main_thread_only().last_unblocked_enqueue_order =
         sequence_manager_->GetNextSequenceNumber();
     sequence_manager_->ScheduleWork();
@@ -799,23 +800,24 @@
   main_thread_only().current_fence = EnqueueOrder::none();
   main_thread_only().delayed_fence = nullopt;
 
-  bool task_unblocked = main_thread_only().immediate_work_queue->RemoveFence();
-  task_unblocked |= main_thread_only().delayed_work_queue->RemoveFence();
+  bool front_task_unblocked =
+      main_thread_only().immediate_work_queue->RemoveFence();
+  front_task_unblocked |= main_thread_only().delayed_work_queue->RemoveFence();
 
   {
     base::internal::CheckedAutoLock lock(any_thread_lock_);
-    if (!task_unblocked && previous_fence) {
+    if (!front_task_unblocked && previous_fence) {
       if (!any_thread_.immediate_incoming_queue.empty() &&
           any_thread_.immediate_incoming_queue.front().enqueue_order() >
               previous_fence) {
-        task_unblocked = true;
+        front_task_unblocked = true;
       }
     }
 
     UpdateCrossThreadQueueStateLocked();
   }
 
-  if (IsQueueEnabled() && task_unblocked) {
+  if (IsQueueEnabled() && front_task_unblocked) {
     main_thread_only().last_unblocked_enqueue_order =
         sequence_manager_->GetNextSequenceNumber();
     sequence_manager_->ScheduleWork();
diff --git a/base/task/thread_pool/task_tracker.cc b/base/task/thread_pool/task_tracker.cc
index 2f3bf68..6b9282f 100644
--- a/base/task/thread_pool/task_tracker.cc
+++ b/base/task/thread_pool/task_tracker.cc
@@ -343,8 +343,8 @@
 
 void TaskTracker::CompleteShutdown() {
   // It is safe to access |shutdown_event_| without holding |lock_| because the
-  // pointer never changes after being set by StartShutdown(), which must be
-  // called before this.
+  // pointer never changes after being set by StartShutdown(), which must
+  // happen-before before this.
   DCHECK(TS_UNCHECKED_READ(shutdown_event_));
   {
     base::ScopedAllowBaseSyncPrimitives allow_wait;
@@ -405,13 +405,7 @@
     // ordering bug. This aims to catch those early.
     CheckedAutoLock auto_lock(shutdown_lock_);
     DCHECK(shutdown_event_);
-    // TODO(http://crbug.com/698140): Atomically shutdown the service thread
-    // to prevent racily posting BLOCK_SHUTDOWN tasks in response to a
-    // FileDescriptorWatcher (and/or make such notifications never be
-    // BLOCK_SHUTDOWN). Then, enable this DCHECK, until then, skip the task.
-    // DCHECK(!shutdown_event_->IsSignaled());
-    if (shutdown_event_->IsSignaled())
-      return false;
+    DCHECK(!shutdown_event_->IsSignaled());
   }
 
   // TODO(scheduler-dev): Record the task traits here.
@@ -643,20 +637,11 @@
     const bool shutdown_started = state_->IncrementNumItemsBlockingShutdown();
 
     if (shutdown_started) {
-
       // A BLOCK_SHUTDOWN task posted after shutdown has completed is an
       // ordering bug. This aims to catch those early.
       CheckedAutoLock auto_lock(shutdown_lock_);
       DCHECK(shutdown_event_);
-      // TODO(http://crbug.com/698140): Atomically shutdown the service thread
-      // to prevent racily posting BLOCK_SHUTDOWN tasks in response to a
-      // FileDescriptorWatcher (and/or make such notifications never be
-      // BLOCK_SHUTDOWN). Then, enable this DCHECK, until then, skip the task.
-      // DCHECK(!shutdown_event_->IsSignaled());
-      if (shutdown_event_->IsSignaled()) {
-        state_->DecrementNumItemsBlockingShutdown();
-        return false;
-      }
+      DCHECK(!shutdown_event_->IsSignaled());
     }
 
     return true;
diff --git a/base/task/thread_pool/task_tracker.h b/base/task/thread_pool/task_tracker.h
index 1ab341e..4a7f28b6 100644
--- a/base/task/thread_pool/task_tracker.h
+++ b/base/task/thread_pool/task_tracker.h
@@ -236,7 +236,10 @@
   const bool has_log_best_effort_tasks_switch_;
 
   // Number of tasks blocking shutdown and boolean indicating whether shutdown
-  // has started.
+  // has started. |shutdown_lock_| should be held to access |shutdown_event_|
+  // when this indicates that shutdown has started because State doesn't provide
+  // memory barriers. It intentionally trades having to use a Lock on shutdown
+  // with not needing memory barriers at runtime.
   const std::unique_ptr<State> state_;
 
   // Number of task sources that haven't completed their execution. Is
diff --git a/base/task/thread_pool/task_tracker_unittest.cc b/base/task/thread_pool/task_tracker_unittest.cc
index c2649fd..00ac240 100644
--- a/base/task/thread_pool/task_tracker_unittest.cc
+++ b/base/task/thread_pool/task_tracker_unittest.cc
@@ -487,7 +487,11 @@
   Task task(CreateTask());
 
   // |task_tracker_| shouldn't allow a task to be posted after shutdown.
-  EXPECT_FALSE(tracker_.WillPostTask(&task, GetParam()));
+  if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN) {
+    EXPECT_DCHECK_DEATH(tracker_.WillPostTask(&task, GetParam()));
+  } else {
+    EXPECT_FALSE(tracker_.WillPostTask(&task, GetParam()));
+  }
 }
 
 // Verify that BLOCK_SHUTDOWN and SKIP_ON_SHUTDOWN tasks can
diff --git a/base/task/thread_pool/thread_pool_impl.cc b/base/task/thread_pool/thread_pool_impl.cc
index 189c86d..5e6e490a 100644
--- a/base/task/thread_pool/thread_pool_impl.cc
+++ b/base/task/thread_pool/thread_pool_impl.cc
@@ -289,6 +289,14 @@
 void ThreadPoolImpl::Shutdown() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  // Stop() the ServiceThread before triggering shutdown. This ensures that no
+  // more delayed tasks or file descriptor watches will trigger during shutdown
+  // (preventing http://crbug.com/698140). None of these asynchronous tasks
+  // being guaranteed to happen anyways, stopping right away is valid behavior
+  // and avoids the more complex alternative of shutting down the service thread
+  // atomically during TaskTracker shutdown.
+  service_thread_->Stop();
+
   task_tracker_->StartShutdown();
 
   // Allow all tasks to run. Done after initiating shutdown to ensure that non-
diff --git a/base/task/thread_pool/thread_pool_impl_unittest.cc b/base/task/thread_pool/thread_pool_impl_unittest.cc
index a2ee40f..880d4fc6 100644
--- a/base/task/thread_pool/thread_pool_impl_unittest.cc
+++ b/base/task/thread_pool/thread_pool_impl_unittest.cc
@@ -770,12 +770,6 @@
   // Give a chance for the file watcher to fire before closing the handles.
   PlatformThread::Sleep(TestTimeouts::tiny_timeout());
 
-  // Need to join the ServiceThread before closing the pipes as the pipe
-  // becoming readable is observed on the ServiceThread and TSAN correctly
-  // identifies this as a race even though the above sleep makes it highly
-  // unlikely in practice.
-  TearDown();
-
   EXPECT_EQ(0, IGNORE_EINTR(close(pipes[0])));
   EXPECT_EQ(0, IGNORE_EINTR(close(pipes[1])));
 }
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index b916d2d8..e977286 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1355,7 +1355,6 @@
   "java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreference.java",
   "java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java",
   "java/src/org/chromium/chrome/browser/preferences/website/StorageInfo.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/TranslatePreferences.java",
   "java/src/org/chromium/chrome/browser/preferences/website/TriStateSiteSettingsPreference.java",
   "java/src/org/chromium/chrome/browser/preferences/website/Website.java",
   "java/src/org/chromium/chrome/browser/preferences/website/WebsiteAddress.java",
diff --git a/chrome/android/java/res/drawable-hdpi/settings_translate.png b/chrome/android/java/res/drawable-hdpi/settings_translate.png
deleted file mode 100644
index 8067680e..0000000
--- a/chrome/android/java/res/drawable-hdpi/settings_translate.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/settings_translate.png b/chrome/android/java/res/drawable-mdpi/settings_translate.png
deleted file mode 100644
index 3b9b4cd..0000000
--- a/chrome/android/java/res/drawable-mdpi/settings_translate.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/settings_translate.png b/chrome/android/java/res/drawable-xhdpi/settings_translate.png
deleted file mode 100644
index 131a573..0000000
--- a/chrome/android/java/res/drawable-xhdpi/settings_translate.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/settings_translate.png b/chrome/android/java/res/drawable-xxhdpi/settings_translate.png
deleted file mode 100644
index 55878e6..0000000
--- a/chrome/android/java/res/drawable-xxhdpi/settings_translate.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/settings_translate.png b/chrome/android/java/res/drawable-xxxhdpi/settings_translate.png
deleted file mode 100644
index 058b50b..0000000
--- a/chrome/android/java/res/drawable-xxxhdpi/settings_translate.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
index e0e937c..817c639 100644
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
@@ -48,7 +48,6 @@
     <string name="help_context_bookmarks">mobile_bookmarks</string>
     <string name="help_context_history">mobile_history</string>
     <string name="help_context_privacy">mobile_privacy</string>
-    <string name="help_context_translate">mobile_translate</string>
     <string name="help_context_general">mobile_general</string>
     <string name="help_context_protected_content">protected_content</string>
     <string name="help_context_data_reduction">reduce_data_usage</string>
diff --git a/chrome/android/java/res/xml/autofill_server_profile_preferences.xml b/chrome/android/java/res/xml/autofill_server_profile_preferences.xml
index 69be874..a183d7f 100644
--- a/chrome/android/java/res/xml/autofill_server_profile_preferences.xml
+++ b/chrome/android/java/res/xml/autofill_server_profile_preferences.xml
@@ -3,9 +3,9 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <Preference
+    <android.support.v7.preference.Preference
         android:key="server_profile_description"
         android:selectable="false" />
 
@@ -14,4 +14,4 @@
         android:widgetLayout="@layout/autofill_server_data_edit_link"
         android:title="@string/autofill_from_google_account_long" />
 
-</PreferenceScreen>
+</android.support.v7.preference.PreferenceScreen>
diff --git a/chrome/android/java/res/xml/site_settings_preferences.xml b/chrome/android/java/res/xml/site_settings_preferences.xml
index d299561..ef75b04 100644
--- a/chrome/android/java/res/xml/site_settings_preferences.xml
+++ b/chrome/android/java/res/xml/site_settings_preferences.xml
@@ -76,12 +76,6 @@
     <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
         android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
         android:key="sound" />
-    <!-- Google Translate -->
-    <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.website.TranslatePreferences"
-        android:key="translate"
-        android:title="@string/google_translate"
-        android:icon="@drawable/settings_translate" />
     <!-- Storage -->
     <!-- TODO(finnur): Move this over to the new Usage screen, once it exists. -->
     <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
diff --git a/chrome/android/java/res/xml/translate_preferences.xml b/chrome/android/java/res/xml/translate_preferences.xml
deleted file mode 100644
index 9b80ffd7..0000000
--- a/chrome/android/java/res/xml/translate_preferences.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2016 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file. -->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
-        android:key="translate_switch"
-        android:summaryOn="@string/text_on"
-        android:summaryOff="@string/text_off"
-        app:drawDivider="true" />
-
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
-        android:title="@string/translate_prefs_description" />
-
-    <org.chromium.chrome.browser.preferences.ButtonPreference
-        android:key="reset_translate_button"
-        android:title="@string/reset_translate_defaults" />
-
-</PreferenceScreen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java b/chrome/android/java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java
index 53511a80..83206ac 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java
@@ -25,8 +25,8 @@
  */
 public class BackgroundSyncBackgroundTaskScheduler {
     /**
-     * Denotes the one-off Background Sync Background Tasks scheduled through
-     * this class.
+     * Denotes the types of one-off Background Tasks scheduled through this
+     * class.
      * ONE_SHOT_SYNC_CHROME_WAKE_UP is the task that processes one-shot
      * Background Sync registrations.
      * PERIODIC_SYNC_CHROME_WAKE_UP processes Periodic Background Sync
@@ -35,8 +35,8 @@
     @IntDef({BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP,
             BackgroundSyncTask.PERIODIC_SYNC_CHROME_WAKE_UP})
     public @interface BackgroundSyncTask {
-        int PERIODIC_SYNC_CHROME_WAKE_UP = 0;
-        int ONE_SHOT_SYNC_CHROME_WAKE_UP = 1;
+        int ONE_SHOT_SYNC_CHROME_WAKE_UP = 0;
+        int PERIODIC_SYNC_CHROME_WAKE_UP = 1;
     };
 
     // Keep in sync with the default min_sync_recovery_time of
@@ -58,10 +58,10 @@
     }
 
     /**
-     * Returns the appropriate TaskID to use based on the class of the Background
+     * Returns the appropriate TaskID to use based on the type of the Background
      * Sync task we're working with.
      *
-     * @param taskType The Background Sync task to get the TaskID for.
+     * @param taskType Type of the Background Sync task to get the TaskID for.
      */
     @VisibleForTesting
     public static int getAppropriateTaskId(@BackgroundSyncTask int taskType) {
@@ -77,10 +77,10 @@
     }
 
     /**
-     * Returns the appropriate task class to use based on the Background
+     * Returns the appropriate task class to use based on the type of the Background
      * Sync task we're working with.
      *
-     * @param taskType The Background Sync task to get the task class for.
+     * @param taskType Type of the Background Sync task to get the task class for.
      */
     @VisibleForTesting
     public static Class<? extends NativeBackgroundTask> getAppropriateTaskClass(
@@ -99,7 +99,7 @@
     /**
      * Cancels a Background Sync one-off task, if there's one scheduled.
      *
-     * @param taskType The Background Sync task to cancel.
+     * @param taskType The type of BackgroundSync task to cancel.
      */
     @VisibleForTesting
     protected void cancelOneOffTask(@BackgroundSyncTask int taskType) {
@@ -113,7 +113,7 @@
      * events.
      *
      * @param minDelayMs The minimum time to wait before waking the browser.
-     * @param taskType   The Background Sync task to schedule.
+     * @param taskType   The type of BackgroundSync task to schedule.
      */
     protected boolean scheduleOneOffTask(long minDelayMs, @BackgroundSyncTask int taskType) {
         // Pack SOONEST_EXPECTED_WAKETIME in extras.
@@ -134,23 +134,21 @@
     }
 
     /**
-     * Based on shouldLaunch, either creates or cancels a one-off background
-     * task to wake up Chrome upon network connectivity.
+     * Based on shouldLaunch, either creates or cancels a one-off background task to
+     * wake up Chrome upon network connectivity.
      *
-     * @param taskType The one-off background task to create.
      * @param shouldLaunch Whether to launch the browser in the background.
      * @param minDelayMs   The minimum time to wait before waking the browser.
      */
     @VisibleForTesting
     @CalledByNative
-    protected void launchBrowserIfStopped(
-            @BackgroundSyncTask int taskType, boolean shouldLaunch, long minDelayMs) {
+    protected void launchBrowserIfStopped(boolean shouldLaunch, long minDelayMs) {
         if (!shouldLaunch) {
-            cancelOneOffTask(taskType);
+            cancelOneOffTask(BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP);
             return;
         }
 
-        scheduleOneOffTask(minDelayMs, taskType);
+        scheduleOneOffTask(minDelayMs, BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP);
     }
 
     /**
@@ -158,7 +156,7 @@
      * Background Sync events in the event of an OS upgrade or Google Play Services
      * upgrade.
      *
-     * @param taskType The Background Sync task to reschedule.
+     * @param taskType The type of BackgroundSync task to reschedule.
      */
     public void reschedule(@BackgroundSyncTask int taskType) {
         scheduleOneOffTask(MIN_SYNC_RECOVERY_TIME, taskType);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
index a85a9f01..54d113e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
@@ -359,13 +359,6 @@
     }
 
     /**
-     * Resets translate defaults if needed
-     */
-    public void resetTranslateDefaults() {
-        nativeResetTranslateDefaults();
-    }
-
-    /**
      * @return the last account id associated with sync.
      */
     public String getSyncLastAccountId() {
@@ -1108,7 +1101,6 @@
     private native boolean nativeGetSoundEnabled();
     private native boolean nativeGetSupervisedUserSafeSitesEnabled();
     private native void nativeSetTranslateEnabled(boolean enabled);
-    private native void nativeResetTranslateDefaults();
     private native void nativeMigrateJavascriptPreference();
     private native boolean nativeGetBrowsingDataDeletionPreference(
             int dataType, int clearBrowsingDataTab);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java
index 52be01c4..87c3a5f3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java
@@ -5,7 +5,8 @@
 package org.chromium.chrome.browser.preferences;
 
 import android.content.Context;
-import android.preference.Preference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceViewHolder;
 import android.util.AttributeSet;
 import android.view.View;
 
@@ -27,10 +28,10 @@
     }
 
     @Override
-    protected void onBindView(View view) {
-        super.onBindView(view);
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
 
-        View button = view.findViewById(R.id.preference_click_target);
+        View button = holder.findViewById(R.id.preference_click_target);
         button.setClickable(true);
         button.setOnClickListener(new View.OnClickListener() {
             @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java
index d37e1ee5..74c5a6a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java
@@ -6,9 +6,8 @@
 
 import android.content.Context;
 import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
-import android.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceFragmentCompat;
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeStringConstants;
@@ -22,15 +21,14 @@
  * Fragment for settings page that allows user to view and edit a single server-provided address.
  */
 public class AutofillServerProfilePreferences
-        extends PreferenceFragment implements OnPreferenceClickListener {
+        extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener {
     private String mGUID;
 
     private static final String PREF_SERVER_PROFILE_DESCRIPTION = "server_profile_description";
     private static final String PREF_SERVER_PROFILE_EDIT_LINK = "server_profile_edit_link";
 
     @Override
-    public void onCreate(Bundle savedState) {
-        super.onCreate(savedState);
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         PreferenceUtils.addPreferencesFromResource(this, R.xml.autofill_server_profile_preferences);
         getActivity().setTitle(R.string.autofill_edit_profile);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
index 0f6eea70..314b202 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
@@ -14,7 +14,6 @@
 import android.support.v7.preference.PreferenceCategory;
 import android.support.v7.preference.PreferenceFragmentCompat;
 import android.support.v7.preference.PreferenceGroup;
-import android.support.v7.preference.PreferenceScreen;
 import android.support.v7.widget.Toolbar;
 import android.text.SpannableString;
 import android.text.style.ForegroundColorSpan;
@@ -117,7 +116,7 @@
             }
         });
         getActivity().setTitle(R.string.prefs_saved_passwords_title);
-        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getActivity()));
+        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getStyledContext()));
         PasswordManagerHandlerProvider.getInstance().addObserver(this);
 
         setHasOptionsMenu(true); // Password Export might be optional but Search is always present.
@@ -247,7 +246,7 @@
 
         PreferenceGroup passwordParent;
         if (mSearchQuery == null) {
-            PreferenceCategory profileCategory = new PreferenceCategory(getActivity());
+            PreferenceCategory profileCategory = new PreferenceCategory(getStyledContext());
             profileCategory.setKey(PREF_KEY_CATEGORY_SAVED_PASSWORDS);
             profileCategory.setTitle(R.string.prefs_saved_passwords_title);
             profileCategory.setOrder(ORDER_SAVED_PASSWORDS);
@@ -266,16 +265,16 @@
             if (shouldBeFiltered(url, name)) {
                 continue; // The current password won't show with the active filter, try the next.
             }
-            PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity());
-            screen.setTitle(url);
-            screen.setOnPreferenceClickListener(this);
-            screen.setSummary(name);
-            Bundle args = screen.getExtras();
+            Preference preference = new Preference(getStyledContext());
+            preference.setTitle(url);
+            preference.setOnPreferenceClickListener(this);
+            preference.setSummary(name);
+            Bundle args = preference.getExtras();
             args.putString(PASSWORD_LIST_NAME, name);
             args.putString(PASSWORD_LIST_URL, url);
             args.putString(PASSWORD_LIST_PASSWORD, password);
             args.putInt(PASSWORD_LIST_ID, i);
-            passwordParent.addPreference(screen);
+            passwordParent.addPreference(preference);
         }
         mNoPasswords = passwordParent.getPreferenceCount() == 0;
         if (mNoPasswords) {
@@ -320,7 +319,7 @@
 
         displayManageAccountLink();
 
-        PreferenceCategory profileCategory = new PreferenceCategory(getActivity());
+        PreferenceCategory profileCategory = new PreferenceCategory(getStyledContext());
         profileCategory.setKey(PREF_KEY_CATEGORY_EXCEPTIONS);
         profileCategory.setTitle(R.string.section_saved_passwords_exceptions);
         profileCategory.setOrder(ORDER_EXCEPTIONS);
@@ -329,13 +328,13 @@
             String exception = PasswordManagerHandlerProvider.getInstance()
                                        .getPasswordManagerHandler()
                                        .getSavedPasswordException(i);
-            PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity());
-            screen.setTitle(exception);
-            screen.setOnPreferenceClickListener(this);
-            Bundle args = screen.getExtras();
+            Preference preference = new Preference(getStyledContext());
+            preference.setTitle(exception);
+            preference.setOnPreferenceClickListener(this);
+            Bundle args = preference.getExtras();
             args.putString(PASSWORD_LIST_URL, exception);
             args.putInt(PASSWORD_LIST_ID, i);
-            profileCategory.addPreference(screen);
+            profileCategory.addPreference(preference);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
index 853da20..3e7407b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
@@ -37,7 +37,6 @@
     // are defined in the SiteSettingsCategory, additional keys
     // are listed here.
     static final String MEDIA_KEY = "media";
-    static final String TRANSLATE_KEY = "translate";
 
     // Whether this class is handling showing the Media sub-menu (and not the main menu).
     boolean mMediaSubMenu;
@@ -79,7 +78,6 @@
                 getPreferenceScreen().removePreference(findPreference(i));
             }
             getPreferenceScreen().removePreference(findPreference(MEDIA_KEY));
-            getPreferenceScreen().removePreference(findPreference(TRANSLATE_KEY));
         } else {
             // These will be tucked under the Media subkey, so don't show them on the main menu.
             getPreferenceScreen().removePreference(findPreference(Type.AUTOPLAY));
@@ -90,7 +88,6 @@
             if (!SiteSettingsCategory.adsCategoryEnabled()) {
                 getPreferenceScreen().removePreference(findPreference(Type.ADS));
             }
-            getPreferenceScreen().removePreference(findPreference(TRANSLATE_KEY));
             if (!ChromeFeatureList.isEnabled(ChromeFeatureList.SENSOR_CONTENT_SETTING)) {
                 getPreferenceScreen().removePreference(findPreference(Type.SENSORS));
             }
@@ -108,10 +105,6 @@
     private void updatePreferenceStates() {
         PrefServiceBridge prefServiceBridge = PrefServiceBridge.getInstance();
 
-        // Translate preference.
-        Preference translatePref = findPreference(TRANSLATE_KEY);
-        if (translatePref != null) setTranslateStateSummary(translatePref);
-
         // Preferences that navigate to Website Settings.
         List<Integer> websitePrefs = new ArrayList<Integer>();
         if (mMediaSubMenu) {
@@ -224,11 +217,4 @@
                 preference.getTitle().toString());
         return false;
     }
-
-    private void setTranslateStateSummary(Preference translatePref) {
-        boolean translateEnabled = PrefServiceBridge.getInstance().isTranslateEnabled();
-        translatePref.setSummary(translateEnabled
-                ? R.string.website_settings_category_ask
-                : R.string.website_settings_category_blocked);
-    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/TranslatePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/TranslatePreferences.java
deleted file mode 100644
index 995967c..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/TranslatePreferences.java
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.preferences.website;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.Preference.OnPreferenceClickListener;
-import android.preference.PreferenceFragment;
-import android.support.graphics.drawable.VectorDrawableCompat;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.ButtonPreference;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
-import org.chromium.chrome.browser.profiles.Profile;
-import org.chromium.ui.widget.Toast;
-
-/**
- * Fragment to keep track of the translate preferences.
- */
-public class TranslatePreferences extends PreferenceFragment {
-
-    public static final String PREF_TRANSLATE_SWITCH = "translate_switch";
-    public static final String PREF_RESET_TRANSLATE_BUTTON = "reset_translate_button";
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        PreferenceUtils.addPreferencesFromResource(this, R.xml.translate_preferences);
-        getActivity().setTitle(R.string.google_translate);
-        setHasOptionsMenu(true);
-
-        final Context context = getActivity();
-        if (context == null) return;
-
-        ChromeSwitchPreference translateSwitch =
-                (ChromeSwitchPreference) findPreference(PREF_TRANSLATE_SWITCH);
-
-        boolean isTranslateEnabled = PrefServiceBridge.getInstance().isTranslateEnabled();
-        translateSwitch.setChecked(isTranslateEnabled);
-
-        translateSwitch.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-            @Override
-            public boolean onPreferenceChange(Preference preference, Object newValue) {
-                PrefServiceBridge.getInstance().setTranslateEnabled((boolean) newValue);
-                return true;
-            }
-        });
-        translateSwitch.setManagedPreferenceDelegate(
-                preference -> PrefServiceBridge.getInstance().isTranslateManaged());
-
-        ButtonPreference resetTranslateButton = (ButtonPreference)
-                findPreference(PREF_RESET_TRANSLATE_BUTTON);
-
-        resetTranslateButton.setOnPreferenceClickListener(new OnPreferenceClickListener(){
-            @Override
-            public boolean onPreferenceClick(Preference preference) {
-                PrefServiceBridge.getInstance().resetTranslateDefaults();
-                Toast.makeText(getActivity(), getString(
-                        R.string.translate_prefs_toast_description),
-                        Toast.LENGTH_SHORT).show();
-                return true;
-            }
-        });
-
-    }
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        menu.clear();
-        MenuItem help = menu.add(
-                Menu.NONE, R.id.menu_id_targeted_help, Menu.NONE, R.string.menu_help);
-        help.setIcon(VectorDrawableCompat.create(
-                getResources(), R.drawable.ic_help_and_feedback, getActivity().getTheme()));
-        help.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-        menu.add(Menu.NONE, R.id.menu_id_reset, Menu.NONE, R.string.reset_translate_defaults);
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        int itemId = item.getItemId();
-        if (itemId == R.id.menu_id_targeted_help) {
-            HelpAndFeedback.getInstance(getActivity())
-                    .show(getActivity(), getString(R.string.help_context_translate),
-                            Profile.getLastUsedProfile(), null);
-            return true;
-        } else if (itemId == R.id.menu_id_reset) {
-            PrefServiceBridge.getInstance().resetTranslateDefaults();
-            Toast.makeText(getActivity(), getString(
-                    R.string.translate_prefs_toast_description),
-                    Toast.LENGTH_SHORT).show();
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/ActivityAssigner.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/ActivityAssigner.java
index 23450d5..8b3a12d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/ActivityAssigner.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/ActivityAssigner.java
@@ -6,14 +6,12 @@
 
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.os.SystemClock;
 import android.support.annotation.IntDef;
 import android.util.Log;
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
-import org.chromium.base.metrics.RecordHistogram;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -273,14 +271,7 @@
         SharedPreferences prefs = ContextUtils.getApplicationContext().getSharedPreferences(
                 mPrefPackage, Context.MODE_PRIVATE);
         try {
-            long time = SystemClock.elapsedRealtime();
             final int numSavedEntries = prefs.getInt(mPrefNumSavedEntries, 0);
-            try {
-                RecordHistogram.recordTimesHistogram("Android.StrictMode.WebappSharedPrefs",
-                        SystemClock.elapsedRealtime() - time);
-            } catch (UnsatisfiedLinkError error) {
-                // Intentionally ignored - it's ok to miss recording the metric occasionally.
-            }
             if (numSavedEntries <= NUM_WEBAPP_ACTIVITIES) {
                 for (int i = 0; i < numSavedEntries; ++i) {
                     String currentActivityIndexPref = mPrefActivityIndex + i;
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 1fe6d09..577e3a3 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -1236,20 +1236,6 @@
         Protected content
       </message>
 
-      <!-- Google translate preferences -->
-      <message name="IDS_GOOGLE_TRANSLATE" desc='Title for the Google Translate settings screen. [CHAR-LIMIT=32]'>
-        Google Translate
-      </message>
-      <message name="IDS_TRANSLATE_PREFS_DESCRIPTION" desc="Translate preference description">
-        When this feature is turned on, Chrome will offer to translate pages written in other languages using Google Translate.
-      </message>
-      <message name="IDS_TRANSLATE_PREFS_TOAST_DESCRIPTION" desc="Translate settings reset toast when resetting defaults">
-        Your translate settings have been reset.
-      </message>
-      <message name="IDS_RESET_TRANSLATE_DEFAULTS" desc="Title for translate reset menu preference">
-        Reset translate settings
-      </message>
-
       <!-- Storage preferences -->
       <message name="IDS_WEBSITE_SETTINGS_STORAGE" desc="Title for Storage settings which show how much data websites are storing on the user's device. [CHAR-LIMIT=32]">
         Storage
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java
index 63ae2131..242c8694 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java
@@ -53,7 +53,7 @@
 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
 @CommandLineFlags.
 Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=LogJsConsoleMessages"})
-@MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) // WebVR is only supported on K+
+@MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on L+
 @Restriction(RESTRICTION_TYPE_SVR)
 public class VrInstallUpdateInfoBarTest {
     @ClassParameter
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java
index 4602dd65..c9e98676 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java
@@ -47,7 +47,6 @@
 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
         "enable-features=LogJsConsoleMessages", "enable-webvr"})
-@MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on L+
 public class WebXrVrDeviceTest {
     @ClassParameter
     private static List<ParameterSet> sClassParams =
@@ -77,6 +76,7 @@
     @Test
     @MediumTest
     @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL})
+    @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on L+
     public void testDeviceCapabilitiesMatchExpectations() throws InterruptedException {
         mWebVrTestFramework.loadUrlAndAwaitInitialization(
                 WebVrTestFramework.getFileUrlForHtmlTestFile(
@@ -95,6 +95,7 @@
     @MediumTest
     @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL})
     @Restriction(RESTRICTION_TYPE_SVR)
+    // Sensorless still works on older devices since it doesn't rely on anything in the DFM.
     public void testGvrlessMagicWindowCapabilities() throws InterruptedException {
         // Make Chrome think that VrCore is not installed
         VrShellDelegateUtils.setVrCoreCompatibility(VrCoreCompatibility.VR_NOT_AVAILABLE);
@@ -119,6 +120,7 @@
             .Remove({"enable-webvr"})
             @CommandLineFlags.Add({"enable-features=WebXR"})
             @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL})
+            @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebXR is only supported on L+
             public void testWebXrCapabilities() throws InterruptedException {
         mWebXrVrTestFramework.loadUrlAndAwaitInitialization(
                 WebXrVrTestFramework.getFileUrlForHtmlTestFile("test_webxr_capabilities"),
@@ -141,6 +143,7 @@
             .Remove({"enable-webvr"})
             @CommandLineFlags.Add({"enable-features=WebXR"})
             @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
+            @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebXR is only supported on L+
             public void testForNullPosesInInlineVrPostImmersive() throws InterruptedException {
         mWebXrVrTestFramework.loadUrlAndAwaitInitialization(
                 WebXrVrTestFramework.getFileUrlForHtmlTestFile("test_inline_vr_poses"),
@@ -176,6 +179,7 @@
             .Remove({"enable-webvr"})
             @CommandLineFlags.Add({"enable-features=WebXR"})
             @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
+            @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on L+
             public void testForNullPosesInInlineVrFromNfc() throws InterruptedException {
         mWebXrVrTestFramework.loadUrlAndAwaitInitialization(
                 WebXrVrTestFramework.getFileUrlForHtmlTestFile("test_inline_vr_poses"),
@@ -209,6 +213,7 @@
             .Remove({"enable-webvr"})
             @CommandLineFlags.Add({"enable-features=WebXR"})
             @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
+            @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on L+
             public void testForNullPosesInInlineVrOnNavigation() throws InterruptedException {
         NfcSimUtils.simNfcScanUntilVrEntry(mTestRule.getActivity());
         mWebXrVrTestFramework.loadUrlAndAwaitInitialization(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java
index f45c006..3da2fffc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java
@@ -43,7 +43,7 @@
 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
         "enable-features=LogJsConsoleMessages", "enable-webvr"})
-@MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) // WebVR is only supported on K+
+@MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on K+
 public class WebXrVrTabTest {
     @ClassParameter
     private static List<ParameterSet> sClassParams =
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java
index 1adf616..dfeb7e6 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java
@@ -86,7 +86,6 @@
     @Feature({"BackgroundSync"})
     public void testLaunchBrowserIfStopped() {
         BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped(
-                BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP,
                 /* shouldLaunch= */ true,
                 /* minDelayMs= */ ONE_DAY_IN_MILLISECONDS);
         verify(mTaskScheduler, times(1))
@@ -121,7 +120,6 @@
     @Feature({"BackgroundSync"})
     public void testCancelOneShotTask() {
         BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped(
-                BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP,
                 /* shouldLaunch= */ true,
                 /* minDelayMs= */ ONE_DAY_IN_MILLISECONDS);
         verify(mTaskScheduler, times(1))
@@ -164,7 +162,6 @@
     @Feature({"BackgroundSync"})
     public void testLaunchBrowserCalledTwice() {
         BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped(
-                BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP,
                 /* shouldLaunch= */ true,
                 /* minDelayMs= */ ONE_DAY_IN_MILLISECONDS);
         verify(mTaskScheduler, times(1))
@@ -174,7 +171,6 @@
         assertEquals(ONE_DAY_IN_MILLISECONDS, taskInfo.getOneOffInfo().getWindowStartTimeMs());
 
         BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped(
-                BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP,
                 /* shouldLaunch= */ true,
                 /* minDelayMs= */ ONE_WEEK_IN_MILLISECONDS);
         verify(mTaskScheduler, times(1))
@@ -210,11 +206,9 @@
     @Feature({"BackgroundSync"})
     public void testLaunchBrowserThenCancel() {
         BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped(
-                BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP,
                 /* shouldLaunch= */ true,
                 /* minDelayMs= */ ONE_DAY_IN_MILLISECONDS);
         BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped(
-                BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP,
                 /* shouldLaunch= */ false,
                 /* minDelayMs= */ ONE_DAY_IN_MILLISECONDS);
 
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn
index b94ea291..af29c36 100644
--- a/chrome/app/BUILD.gn
+++ b/chrome/app/BUILD.gn
@@ -454,6 +454,7 @@
     deps += [
       "//chrome/browser/ui/webui/chromeos/add_supervision:mojo_bindings",
       "//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings",
+      "//chrome/services/cups_proxy/public/cpp:manifest",
       "//chrome/services/cups_proxy/public/mojom",
       "//chromeos/assistant:buildflags",
       "//chromeos/services/cellular_setup/public/mojom",
@@ -619,7 +620,6 @@
     deps += [
       "//ash/public/cpp:manifest",
       "//chrome/services/cups_ipp_parser/public/cpp:manifest",
-      "//chrome/services/cups_proxy/public/cpp:manifest",
       "//chromeos/services/cellular_setup/public/cpp:manifest",
       "//chromeos/services/ime/public/cpp:manifest",
       "//chromeos/services/network_config/public/cpp:manifest",
diff --git a/chrome/app/DEPS b/chrome/app/DEPS
index cd61910..af15780 100644
--- a/chrome/app/DEPS
+++ b/chrome/app/DEPS
@@ -84,7 +84,6 @@
   ],
   "builtin_service_manifests\.cc": [
     "+chrome/services/cups_ipp_parser/public",
-    "+chrome/services/cups_proxy/public",
     "+chrome/services/file_util/public",
     "+chrome/services/isolated_xr_device/manifest.h",
     "+chrome/services/media_gallery_util/public",
diff --git a/chrome/app/builtin_service_manifests.cc b/chrome/app/builtin_service_manifests.cc
index 45184cb..9d1a96e 100644
--- a/chrome/app/builtin_service_manifests.cc
+++ b/chrome/app/builtin_service_manifests.cc
@@ -24,7 +24,6 @@
 #if defined(OS_CHROMEOS)
 #include "ash/public/cpp/manifest.h"
 #include "chrome/services/cups_ipp_parser/public/cpp/manifest.h"  // nogncheck
-#include "chrome/services/cups_proxy/public/cpp/manifest.h"
 #include "chromeos/services/cellular_setup/public/cpp/manifest.h"
 #include "chromeos/services/ime/public/cpp/manifest.h"
 #include "chromeos/services/network_config/public/cpp/manifest.h"
@@ -145,7 +144,6 @@
       chromeos::cellular_setup::GetManifest(),
       chromeos::ime::GetManifest(),
       chromeos::network_config::GetManifest(),
-      chromeos::printing::GetCupsProxyManifest(),
       chromeos::secure_channel::GetManifest(),
       GetCupsIppParserManifest(),
 #endif
diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h
index e4bb299..385adb9 100644
--- a/chrome/app/chrome_command_ids.h
+++ b/chrome/app/chrome_command_ids.h
@@ -329,6 +329,9 @@
 #define IDC_BOOKMARK_BAR_UNDO 51012
 #define IDC_BOOKMARK_BAR_REDO 51013
 #define IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS 51014
+// Context menu items for Sharing
+#define IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE 51030
+#define IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES 51031
 
 // Context menu items in the status tray
 #define IDC_STATUS_TRAY_KEEP_CHROME_RUNNING_IN_BACKGROUND 51100
diff --git a/chrome/app/chrome_content_browser_overlay_manifest.cc b/chrome/app/chrome_content_browser_overlay_manifest.cc
index 43ad206..7ba31e824 100644
--- a/chrome/app/chrome_content_browser_overlay_manifest.cc
+++ b/chrome/app/chrome_content_browser_overlay_manifest.cc
@@ -51,6 +51,7 @@
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision.mojom.h"
 #include "chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_page_handler.mojom.h"
+#include "chrome/services/cups_proxy/public/cpp/manifest.h"
 #include "chrome/services/cups_proxy/public/mojom/constants.mojom.h"
 #include "chromeos/assistant/buildflags.h"  // nogncheck
 #include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h"
@@ -254,6 +255,7 @@
 #if defined(OS_CHROMEOS)
         .PackageService(chromeos::device_sync::GetManifest())
         .PackageService(chromeos::multidevice_setup::GetManifest())
+        .PackageService(chromeos::printing::GetCupsProxyManifest())
 #if BUILDFLAG(ENABLE_CROS_ASSISTANT)
         .PackageService(chromeos::assistant::GetManifest())
 #endif
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index e20d22e..6826d3f 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -6415,6 +6415,25 @@
         </message>
       </if>
 
+      <!-- Sharing features. -->
+      <if expr="not use_titlecase">
+        <message name="IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES" desc="The label of item for click to call in context menu when multiple devices are available.">
+          Call from your devices
+        </message>
+        <message name="IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE" desc="The label of item for click to call in context menu for showing device name when multiple devices are available.">
+          Call from <ph name="DEVICE_NAME">$1<ex>Jimmy's Pixel</ex></ph>
+        </message>
+      </if>
+
+      <if expr="use_titlecase">
+        <message name="IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES" desc="In Title Case: The label of item for click to call in context menu when multiple devices are available.">
+          Call from Your Devices
+        </message>
+        <message name="IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE" desc="In Title Case: The label of item for click to call in context menu when single device is available.">
+          Call from <ph name="DEVICE_NAME">$1<ex>Jimmy's Pixel</ex></ph>
+        </message>
+      </if>
+
 
       <!-- Collected cookies window -->
       <message name="IDS_COLLECTED_COOKIES_DIALOG_TITLE" desc="The title of the collect cookies dialog">
diff --git a/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES.png.sha1 b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES.png.sha1
new file mode 100644
index 0000000..7db1032
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES.png.sha1
@@ -0,0 +1 @@
+d3ea7c88529dd93e5f403fa57d5df3bfadf8936a
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE.png.sha1 b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE.png.sha1
new file mode 100644
index 0000000..c83107a
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE.png.sha1
@@ -0,0 +1 @@
+bc5be9872a3e0a2c30bbb9a80ac370cafa339988
\ No newline at end of file
diff --git a/chrome/app/printing_strings_grd/OWNERS b/chrome/app/printing_strings_grd/OWNERS
index 9b08c66..01ea38e 100644
--- a/chrome/app/printing_strings_grd/OWNERS
+++ b/chrome/app/printing_strings_grd/OWNERS
@@ -1 +1,2 @@
 file://printing/OWNERS
+# COMPONENT: Internals>Printing
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 8e21f915..0602b08 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -913,6 +913,7 @@
     "ntp_tiles/chrome_popular_sites_factory.h",
     "offline_items_collection/offline_content_aggregator_factory.cc",
     "offline_items_collection/offline_content_aggregator_factory.h",
+    "omnibox/common/omnibox_features.h",
     "page_load_metrics/metrics_navigation_throttle.cc",
     "page_load_metrics/metrics_navigation_throttle.h",
     "page_load_metrics/metrics_web_contents_observer.cc",
@@ -2932,6 +2933,8 @@
       "download/download_shelf_controller.h",
       "enterprise_reporting/extension_info.cc",
       "enterprise_reporting/extension_info.h",
+      "enterprise_reporting/policy_info.cc",
+      "enterprise_reporting/policy_info.h",
       "enterprise_reporting/prefs.cc",
       "enterprise_reporting/prefs.h",
       "enterprise_reporting/profile_report_generator.cc",
@@ -3309,8 +3312,12 @@
       "serial/serial_chooser_context_factory.cc",
       "serial/serial_chooser_context_factory.h",
       "sharing/click_to_call/click_to_call_constants.h",
+      "sharing/click_to_call/click_to_call_context_menu_observer.cc",
+      "sharing/click_to_call/click_to_call_context_menu_observer.h",
       "sharing/click_to_call/click_to_call_sharing_dialog_controller.cc",
       "sharing/click_to_call/click_to_call_sharing_dialog_controller.h",
+      "sharing/click_to_call/click_to_call_utils.cc",
+      "sharing/click_to_call/click_to_call_utils.h",
       "sharing/sharing_dialog_controller.cc",
       "sharing/sharing_dialog_controller.h",
       "signin/signin_promo.cc",
@@ -3566,6 +3573,7 @@
       "//ash/public/cpp",
       "//chrome/browser/chromeos",
       "//chrome/services/cups_proxy",
+      "//chrome/services/cups_proxy/public/mojom",
       "//chromeos/components/account_manager",
       "//chromeos/services/assistant/public:feature_flags",
       "//chromeos/services/cellular_setup",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 433184a..f671797 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3483,11 +3483,6 @@
      flag_descriptions::kEnableGoogleAssistantDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::switches::kAssistantFeature)},
 
-    {"enable-assistant-voice-match",
-     flag_descriptions::kEnableAssistantVoiceMatchName,
-     flag_descriptions::kEnableAssistantVoiceMatchDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::assistant::features::kAssistantVoiceMatch)},
-
     {"enable-assistant-dsp", flag_descriptions::kEnableGoogleAssistantDspName,
      flag_descriptions::kEnableGoogleAssistantDspDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::assistant::features::kEnableDspHotword)},
diff --git a/chrome/browser/accessibility/accessibility_extension_api.cc b/chrome/browser/accessibility/accessibility_extension_api.cc
index 6d4b05a..d3deac9 100644
--- a/chrome/browser/accessibility/accessibility_extension_api.cc
+++ b/chrome/browser/accessibility/accessibility_extension_api.cc
@@ -32,6 +32,7 @@
 #include "extensions/common/image_util.h"
 #include "extensions/common/manifest_handlers/background_info.h"
 #include "services/service_manager/public/cpp/connector.h"
+#include "ui/accessibility/accessibility_switches.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 
@@ -433,7 +434,13 @@
 
   int padding = 40;
   int item_width = 88;
-  int item_height = 60;
+
+  int item_height;
+  if (::switches::IsExperimentalAccessibilitySwitchAccessTextEnabled()) {
+    item_height = 85;
+  } else {
+    item_height = 60;
+  }
   // TODO(anastasi): This should be a preference that the user can change.
   int max_cols = 3;
 
diff --git a/chrome/browser/android/background_sync_launcher_android.cc b/chrome/browser/android/background_sync_launcher_android.cc
index 5800344..c7a05ba 100644
--- a/chrome/browser/android/background_sync_launcher_android.cc
+++ b/chrome/browser/android/background_sync_launcher_android.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/android/chrome_feature_list.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "content/public/browser/background_sync_context.h"
-#include "content/public/browser/background_sync_parameters.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/storage_partition.h"
@@ -33,12 +32,6 @@
 // updated before every test run. (https://crbug.com/514449)
 bool disable_play_services_version_check_for_tests = false;
 
-// Returns 0 to create a ONE_SHOT_SYNC_CHROME_WAKE_UP task, or 1 to create a
-// PERIODIC_SYNC_CHROME_WAKE_UP task, based on |sync_type|.
-int GetBackgroundTaskType(blink::mojom::BackgroundSyncType sync_type) {
-  return static_cast<int>(sync_type);
-}
-
 }  // namespace
 
 // static
@@ -69,21 +62,10 @@
 }
 
 // static
-void BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUp(
-    blink::mojom::BackgroundSyncType sync_type) {
+void BackgroundSyncLauncherAndroid::LaunchBrowserIfStopped() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  Get()->ScheduleBrowserWakeUpImpl(sync_type);
-}
-
-// static
-void BackgroundSyncLauncherAndroid::LaunchBrowserWithWakeUpDelta(
-    blink::mojom::BackgroundSyncType sync_type,
-    base::TimeDelta soonest_wakeup_delta) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  Get()->ScheduleBrowserWakeUpWithWakeUpDeltaImpl(sync_type,
-                                                  soonest_wakeup_delta);
+  Get()->LaunchBrowserIfStoppedImpl();
 }
 
 // static
@@ -102,22 +84,19 @@
       base::android::AttachCurrentThread());
 }
 
-void BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUpImpl(
-    blink::mojom::BackgroundSyncType sync_type) {
+void BackgroundSyncLauncherAndroid::LaunchBrowserIfStoppedImpl() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   auto* profile = ProfileManager::GetLastUsedProfile();
   DCHECK(profile);
 
   content::BackgroundSyncContext::GetSoonestWakeupDeltaAcrossPartitions(
-      sync_type, profile,
-      base::BindOnce(&BackgroundSyncLauncherAndroid::
-                         ScheduleBrowserWakeUpWithWakeUpDeltaImpl,
-                     base::Unretained(this), sync_type));
+      profile, base::BindOnce(
+                   &BackgroundSyncLauncherAndroid::LaunchBrowserWithWakeupDelta,
+                   base::Unretained(this)));
 }
 
-void BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUpWithWakeUpDeltaImpl(
-    blink::mojom::BackgroundSyncType sync_type,
+void BackgroundSyncLauncherAndroid::LaunchBrowserWithWakeupDelta(
     base::TimeDelta soonest_wakeup_delta) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
@@ -134,8 +113,7 @@
 
   Java_BackgroundSyncBackgroundTaskScheduler_launchBrowserIfStopped(
       env, java_background_sync_background_task_scheduler_launcher_,
-      GetBackgroundTaskType(sync_type), !soonest_wakeup_delta.is_max(),
-      min_delay_ms);
+      !soonest_wakeup_delta.is_max(), min_delay_ms);
 }
 
 void BackgroundSyncLauncherAndroid::FireBackgroundSyncEvents(
diff --git a/chrome/browser/android/background_sync_launcher_android.h b/chrome/browser/android/background_sync_launcher_android.h
index 80f264b..c59d0f8 100644
--- a/chrome/browser/android/background_sync_launcher_android.h
+++ b/chrome/browser/android/background_sync_launcher_android.h
@@ -29,15 +29,7 @@
   // is running when the device next goes online after that time has passed.
   // If this time is set to base::TimeDelta::Max() across all storage
   // partitions, the wake-up task is cancelled.
-  static void ScheduleBrowserWakeUp(blink::mojom::BackgroundSyncType sync_type);
-
-  // Schedule a background task to bring up Chrome when the device next goes
-  // online after |soonest_wakeup_delta| has passed.
-  // If |soonest_wakeup_delta| is set to base::TimeDelta::Max(), the wake-up
-  // task is cancelled.
-  static void LaunchBrowserWithWakeUpDelta(
-      blink::mojom::BackgroundSyncType sync_type,
-      base::TimeDelta soonest_wakeup_delta);
+  static void LaunchBrowserIfStopped();
 
   static bool ShouldDisableBackgroundSync();
 
@@ -59,10 +51,8 @@
   BackgroundSyncLauncherAndroid();
   ~BackgroundSyncLauncherAndroid();
 
-  void ScheduleBrowserWakeUpImpl(blink::mojom::BackgroundSyncType sync_type);
-  void ScheduleBrowserWakeUpWithWakeUpDeltaImpl(
-      blink::mojom::BackgroundSyncType sync_type,
-      base::TimeDelta soonest_wakeup_delta);
+  void LaunchBrowserIfStoppedImpl();
+  void LaunchBrowserWithWakeupDelta(base::TimeDelta soonest_wakeup_delta);
 
   base::android::ScopedJavaGlobalRef<jobject>
       java_gcm_network_manager_launcher_;
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc
index 6f079ade..3dba2ccf8 100644
--- a/chrome/browser/android/preferences/pref_service_bridge.cc
+++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -873,14 +873,6 @@
   GetPrefService()->SetBoolean(prefs::kOfferTranslateEnabled, enabled);
 }
 
-static void JNI_PrefServiceBridge_ResetTranslateDefaults(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
-  std::unique_ptr<translate::TranslatePrefs> translate_prefs =
-      ChromeTranslateClient::CreateTranslatePrefs(GetPrefService());
-  translate_prefs->ResetToDefaults();
-}
-
 static void JNI_PrefServiceBridge_MigrateJavascriptPreference(
     JNIEnv* env,
     const JavaParamRef<jobject>& obj) {
diff --git a/chrome/browser/background_sync/background_sync_controller_impl.cc b/chrome/browser/background_sync/background_sync_controller_impl.cc
index 6a8f9758..366e31e9 100644
--- a/chrome/browser/background_sync/background_sync_controller_impl.cc
+++ b/chrome/browser/background_sync/background_sync_controller_impl.cc
@@ -157,15 +157,13 @@
       origin, status_code, num_attempts, max_attempts);
 }
 
-void BackgroundSyncControllerImpl::ScheduleBrowserWakeUp(
-    blink::mojom::BackgroundSyncType sync_type) {
+void BackgroundSyncControllerImpl::RunInBackground() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   if (profile_->IsOffTheRecord())
     return;
-
 #if defined(OS_ANDROID)
-  BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUp(sync_type);
+  BackgroundSyncLauncherAndroid::LaunchBrowserIfStopped();
 #endif
 }
 
diff --git a/chrome/browser/background_sync/background_sync_controller_impl.h b/chrome/browser/background_sync/background_sync_controller_impl.h
index 3816f98f..c45b3334 100644
--- a/chrome/browser/background_sync/background_sync_controller_impl.h
+++ b/chrome/browser/background_sync/background_sync_controller_impl.h
@@ -75,8 +75,7 @@
                                      blink::ServiceWorkerStatusCode status_code,
                                      int num_attempts,
                                      int max_attempts) override;
-  void ScheduleBrowserWakeUp(
-      blink::mojom::BackgroundSyncType sync_type) override;
+  void RunInBackground() override;
   base::TimeDelta GetNextEventDelay(
       const url::Origin& origin,
       int64_t min_interval,
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index b033e5fc..4b0eba4 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -57,6 +57,7 @@
 #include "chrome/browser/component_updater/crl_set_component_installer.h"
 #include "chrome/browser/component_updater/file_type_policies_component_installer.h"
 #include "chrome/browser/component_updater/mei_preload_component_installer.h"
+#include "chrome/browser/component_updater/on_device_head_suggest_component_installer.h"
 #include "chrome/browser/component_updater/optimization_hints_component_installer.h"
 #include "chrome/browser/component_updater/origin_trials_component_installer.h"
 #include "chrome/browser/component_updater/pepper_flash_component_installer.h"
@@ -489,6 +490,7 @@
   whitelist_installer->RegisterComponents();
 
   RegisterSubresourceFilterComponent(cus);
+  RegisterOnDeviceHeadSuggestComponent(cus);
   RegisterOptimizationHintsComponent(cus, profile_prefs);
 
   base::FilePath path;
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 21c9bba..da97e83d 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -411,15 +411,12 @@
 #include "chrome/browser/chromeos/login/startup_utils.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
-#include "chrome/browser/chromeos/printing/cups_proxy_service_delegate_impl.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/system/input_device_settings.h"
 #include "chrome/browser/speech/tts_chromeos.h"
 #include "chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.h"
 #include "chrome/browser/ui/ash/tablet_mode_client.h"
 #include "chrome/browser/ui/browser_dialogs.h"
-#include "chrome/services/cups_proxy/cups_proxy_service.h"
-#include "chrome/services/cups_proxy/public/mojom/constants.mojom.h"
 #include "chromeos/constants/chromeos_constants.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/constants/chromeos_switches.h"
@@ -1546,26 +1543,28 @@
 
 bool ChromeContentBrowserClient::ShouldUseProcessPerSite(
     content::BrowserContext* browser_context, const GURL& effective_url) {
-  // Non-extension, non-Instant URLs should generally use
-  // process-per-site-instance.  Because we expect to use the effective URL,
-  // URLs for hosted apps (apart from bookmark apps) should have an extension
-  // scheme by now.
-
   Profile* profile = Profile::FromBrowserContext(browser_context);
   if (!profile)
     return false;
 
+  // NTP should use process-per-site.  This is a performance optimization to
+  // reduce process count associated with NTP tabs.
+  if (effective_url == GURL(chrome::kChromeUINewTabURL))
+    return true;
 #if !defined(OS_ANDROID)
   if (search::ShouldUseProcessPerSiteForInstantURL(effective_url, profile))
     return true;
 #endif
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-  return ChromeContentBrowserClientExtensionsPart::ShouldUseProcessPerSite(
-      profile, effective_url);
-#else
-  return false;
+  if (ChromeContentBrowserClientExtensionsPart::ShouldUseProcessPerSite(
+          profile, effective_url))
+    return true;
 #endif
+
+  // Non-extension, non-NTP URLs should generally use process-per-site-instance
+  // (rather than process-per-site).
+  return false;
 }
 
 bool ChromeContentBrowserClient::ShouldUseSpareRenderProcessHost(
@@ -4071,14 +4070,6 @@
     return;
   }
 
-  if (service_name == chromeos::printing::mojom::kCupsProxyServiceName) {
-    service_manager::Service::RunAsyncUntilTermination(
-        std::make_unique<chromeos::printing::CupsProxyService>(
-            std::move(*receiver),
-            std::make_unique<chromeos::CupsProxyServiceDelegateImpl>()));
-    return;
-  }
-
   if (service_name == chromeos::network_config::mojom::kServiceName) {
     service_manager::Service::RunAsyncUntilTermination(
         std::make_unique<chromeos::network_config::NetworkConfigService>(
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 8a8c907..3f627b6 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1861,6 +1861,8 @@
     "printing/cups_proxy_service_delegate_impl.h",
     "printing/cups_proxy_service_manager.cc",
     "printing/cups_proxy_service_manager.h",
+    "printing/cups_proxy_service_manager_factory.cc",
+    "printing/cups_proxy_service_manager_factory.h",
     "printing/enterprise_printers_provider.cc",
     "printing/enterprise_printers_provider.h",
     "printing/ppd_provider_factory.cc",
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 0578946..dd1e8827 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -96,7 +96,6 @@
 #include "chrome/browser/chromeos/power/power_metrics_reporter.h"
 #include "chrome/browser/chromeos/power/process_data_collector.h"
 #include "chrome/browser/chromeos/power/renderer_freezer.h"
-#include "chrome/browser/chromeos/printing/cups_proxy_service_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/resource_reporter/resource_reporter.h"
 #include "chrome/browser/chromeos/scheduler_configuration_manager.h"
@@ -713,8 +712,6 @@
   lock_to_single_user_manager_ =
       std::make_unique<policy::LockToSingleUserManager>();
 
-  cups_proxy_service_manager_ = std::make_unique<CupsProxyServiceManager>();
-
   ChromeBrowserMainPartsLinux::PreMainMessageLoopRun();
 }
 
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
index 653ec18..ac760e8 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -39,7 +39,6 @@
 
 class ArcKioskAppManager;
 class CrosUsbDetector;
-class CupsProxyServiceManager;
 class DemoModeResourcesRemover;
 class DiscoverManager;
 class EventRewriterDelegateImpl;
@@ -174,8 +173,6 @@
   std::unique_ptr<WilcoDtcSupportdManager> wilco_dtc_supportd_manager_;
 
   std::unique_ptr<GnubbyNotification> gnubby_notification_;
-  std::unique_ptr<chromeos::CupsProxyServiceManager>
-      cups_proxy_service_manager_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsChromeos);
 };
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index 49677c0..f21ebdc 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -428,7 +428,7 @@
   base::Value all_policies_array = policy::GetAllPolicyValuesAsDictionary(
       browser_context(), true /* with_user_policies */,
       false /* convert_values */, true /* with_device_data */,
-      false /* pretty_print */);
+      false /* pretty_print */, true /* convert_types */);
 
   return RespondNow(OneArgument(
       base::Value::ToUniquePtrValue(std::move(all_policies_array))));
diff --git a/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc b/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc
index c2e3f9d..5c48299 100644
--- a/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc
+++ b/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc
@@ -4,9 +4,10 @@
 
 #include "chrome/browser/chromeos/printing/cups_proxy_service_manager.h"
 
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/services/cups_proxy/public/mojom/constants.mojom.h"
 #include "chromeos/dbus/cups_proxy/cups_proxy_client.h"
-#include "content/public/browser/system_connector.h"
+#include "content/public/browser/browser_context.h"
 #include "services/service_manager/public/cpp/connector.h"
 
 namespace chromeos {
@@ -29,9 +30,12 @@
   // Note: The service does not support BindInterface calls, so we
   // intentionally leave out a connection_error_handler, since it would
   // called immediately.
-  content::GetSystemConnector()->Connect(
-      printing::mojom::kCupsProxyServiceName,
-      service_handle_.BindNewPipeAndPassReceiver());
+  // TODO(crbug.com/945409): Manage our own service instance when ServiceManager
+  // goes away.
+  content::BrowserContext::GetConnectorFor(
+      ProfileManager::GetPrimaryUserProfile())
+      ->Connect(printing::mojom::kCupsProxyServiceName,
+                service_handle_.BindNewPipeAndPassReceiver());
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/cups_proxy_service_manager.h b/chrome/browser/chromeos/printing/cups_proxy_service_manager.h
index dc7cdf1..ab3760ee 100644
--- a/chrome/browser/chromeos/printing/cups_proxy_service_manager.h
+++ b/chrome/browser/chromeos/printing/cups_proxy_service_manager.h
@@ -8,19 +8,23 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/services/cups_proxy/public/mojom/proxy.mojom.h"
+#include "components/keyed_service/core/keyed_service.h"
 #include "mojo/public/cpp/bindings/remote.h"
 
 namespace chromeos {
 
-// Responsible for lazily starting the CupsProxyService once notified that the
-// CupsProxyDaemon has started.
+// This KeyedService is responsible for helping manage the
+// lifetime of the CupsProxyService. This manager is started with the Profile
+// and launches the service once the CupsProxyDaemon has started. Notice that
+// this manager's interface is empty; this reflects the fact that the service's
+// sole client is the daemon.
 //
-// Note: This manager is not currently fault-tolerant, i.e. should the
-// service/daemon fail, we do not try to restart.
-class CupsProxyServiceManager {
+// Note: This manager is not fault-tolerant, i.e. should the service/daemon
+// fail, we do not try to restart.
+class CupsProxyServiceManager : public KeyedService {
  public:
   CupsProxyServiceManager();
-  ~CupsProxyServiceManager();
+  ~CupsProxyServiceManager() override;
 
  private:
   void OnDaemonAvailable(bool daemon_available);
diff --git a/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.cc b/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.cc
new file mode 100644
index 0000000..0253b828
--- /dev/null
+++ b/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.cc
@@ -0,0 +1,60 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.h"
+
+#include "chrome/browser/chromeos/printing/cups_proxy_service_manager.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/profiles/incognito_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+
+namespace chromeos {
+
+// static
+CupsProxyServiceManagerFactory* CupsProxyServiceManagerFactory::GetInstance() {
+  static base::NoDestructor<CupsProxyServiceManagerFactory> factory;
+  return factory.get();
+}
+
+// static
+CupsProxyServiceManager* CupsProxyServiceManagerFactory::GetForBrowserContext(
+    content::BrowserContext* context) {
+  return static_cast<CupsProxyServiceManager*>(
+      GetInstance()->GetServiceForBrowserContext(context, true));
+}
+
+CupsProxyServiceManagerFactory::CupsProxyServiceManagerFactory()
+    : BrowserContextKeyedServiceFactory(
+          "CupsProxyServiceManagerFactory",
+          BrowserContextDependencyManager::GetInstance()) {}
+
+CupsProxyServiceManagerFactory::~CupsProxyServiceManagerFactory() = default;
+
+KeyedService* CupsProxyServiceManagerFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  // We do not need an instance of CupsProxyServiceManager on the lockscreen.
+  if (ProfileHelper::IsLockScreenAppProfile(
+          Profile::FromBrowserContext(context)) ||
+      ProfileHelper::IsSigninProfile(Profile::FromBrowserContext(context))) {
+    return nullptr;
+  }
+  return new CupsProxyServiceManager();
+}
+
+content::BrowserContext* CupsProxyServiceManagerFactory::GetBrowserContextToUse(
+    content::BrowserContext* context) const {
+  return chrome::GetBrowserContextRedirectedInIncognito(context);
+}
+
+bool CupsProxyServiceManagerFactory::ServiceIsCreatedWithBrowserContext()
+    const {
+  return true;
+}
+
+bool CupsProxyServiceManagerFactory::ServiceIsNULLWhileTesting() const {
+  return true;
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.h b/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.h
new file mode 100644
index 0000000..c9c3acf
--- /dev/null
+++ b/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.h
@@ -0,0 +1,45 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_PRINTING_CUPS_PROXY_SERVICE_MANAGER_FACTORY_H_
+#define CHROME_BROWSER_CHROMEOS_PRINTING_CUPS_PROXY_SERVICE_MANAGER_FACTORY_H_
+
+#include "base/no_destructor.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+namespace content {
+class BrowserContext;
+}
+
+namespace chromeos {
+
+class CupsProxyServiceManager;
+
+class CupsProxyServiceManagerFactory
+    : public BrowserContextKeyedServiceFactory {
+ public:
+  static CupsProxyServiceManagerFactory* GetInstance();
+  static CupsProxyServiceManager* GetForBrowserContext(
+      content::BrowserContext* context);
+
+ private:
+  friend base::NoDestructor<CupsProxyServiceManagerFactory>;
+
+  CupsProxyServiceManagerFactory();
+  ~CupsProxyServiceManagerFactory() override;
+
+  // BrowserContextKeyedServiceFactory overrides:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override;
+  content::BrowserContext* GetBrowserContextToUse(
+      content::BrowserContext* context) const override;
+  bool ServiceIsCreatedWithBrowserContext() const override;
+  bool ServiceIsNULLWhileTesting() const override;
+
+  DISALLOW_COPY_AND_ASSIGN(CupsProxyServiceManagerFactory);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_PRINTING_CUPS_PROXY_SERVICE_MANAGER_FACTORY_H_
diff --git a/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc b/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc
index 359d791..baa32161 100644
--- a/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc
+++ b/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc
@@ -18,15 +18,16 @@
 #include "components/component_updater/component_installer.h"
 #include "components/component_updater/component_updater_paths.h"
 #include "components/component_updater/component_updater_service.h"
+#include "components/omnibox/common/omnibox_features.h"
 
 namespace component_updater {
 
 namespace {
-// CRX hash. The extension id is: mokoelfideihaddlikjdmdbecmlibfaj.
+// CRX hash. The extension id is: feejiaigafnbpeeogmhmjfmkcjplcneb.
 const uint8_t kOnDeviceHeadSuggestPublicKeySHA256[32] = {
-    0xce, 0xae, 0x4b, 0x58, 0x34, 0x87, 0x03, 0x3b, 0x8a, 0x93, 0xc3,
-    0x14, 0x2c, 0xb8, 0x15, 0x09, 0x6e, 0x41, 0x6b, 0xc0, 0xb4, 0x0d,
-    0x96, 0x2b, 0xd6, 0x7e, 0xd9, 0x97, 0xc6, 0x2a, 0xb0, 0x9f};
+    0x54, 0x49, 0x80, 0x86, 0x05, 0xd1, 0xf4, 0x4e, 0x6c, 0x7c, 0x95,
+    0xca, 0x29, 0xfb, 0x2d, 0x41, 0xe5, 0x12, 0x55, 0x83, 0x59, 0x58,
+    0x50, 0x41, 0x02, 0x6b, 0xb9, 0x06, 0x2c, 0xe0, 0xf8, 0x34};
 
 void UpdateModelDirectory(const base::FilePath& file_path) {
   base::PathService::Override(DIR_ON_DEVICE_HEAD_SUGGEST, file_path);
@@ -57,14 +58,8 @@
     const base::DictionaryValue& manifest,
     const base::FilePath& install_dir) const {
   const std::string* name = manifest.FindStringPath("name");
-  const std::string* locale = manifest.FindStringPath("locale");
 
-  if (!name || !locale)
-    return false;
-
-  if (!base::StartsWith(*name, "OnDeviceHeadSuggest",
-                        base::CompareCase::SENSITIVE) ||
-      *locale != accept_locale_)
+  if (!name || *name != ("OnDeviceHeadSuggest" + accept_locale_))
     return false;
 
   return base::PathExists(install_dir);
@@ -123,9 +118,11 @@
 }
 
 void RegisterOnDeviceHeadSuggestComponent(ComponentUpdateService* cus) {
-  auto installer = base::MakeRefCounted<ComponentInstaller>(
-      std::make_unique<OnDeviceHeadSuggestInstallerPolicy>());
-  installer->Register(cus, base::OnceClosure());
+  if (base::FeatureList::IsEnabled(omnibox::kOnDeviceHeadProvider)) {
+    auto installer = base::MakeRefCounted<ComponentInstaller>(
+        std::make_unique<OnDeviceHeadSuggestInstallerPolicy>());
+    installer->Register(cus, base::OnceClosure());
+  }
 }
 
 }  // namespace component_updater
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc
index 170901f..e0d2c5c 100644
--- a/chrome/browser/download/download_target_determiner.cc
+++ b/chrome/browser/download/download_target_determiner.cc
@@ -290,6 +290,7 @@
     }
     virtual_path_ = target_directory.Append(generated_filename);
     should_notify_extensions_ = true;
+    DCHECK(virtual_path_.IsAbsolute());
   } else {
     conflict_action_ = DownloadPathReservationTracker::OVERWRITE;
     virtual_path_ = download_->GetForcedFilePath();
@@ -299,8 +300,8 @@
     // issue with the forced path, the user is still not prompted. If the path
     // supplied to a programmatic download is invalid, then the caller needs to
     // intervene.
+    DCHECK(virtual_path_.IsAbsolute());
   }
-  DCHECK(virtual_path_.IsAbsolute());
   DVLOG(20) << "Generated virtual path: " << virtual_path_.AsUTF8Unsafe();
 
   return CONTINUE;
diff --git a/chrome/browser/enterprise_reporting/policy_info.cc b/chrome/browser/enterprise_reporting/policy_info.cc
new file mode 100644
index 0000000..46062d12
--- /dev/null
+++ b/chrome/browser/enterprise_reporting/policy_info.cc
@@ -0,0 +1,84 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/enterprise_reporting/policy_info.h"
+
+#include "base/json/json_writer.h"
+#include "base/optional.h"
+#include "chrome/browser/policy/policy_conversions.h"
+#include "components/policy/core/common/policy_types.h"
+
+namespace enterprise_reporting {
+
+using namespace policy;
+
+namespace {
+
+em::Policy_PolicyLevel GetLevel(const base::Value& policy) {
+  switch (static_cast<PolicyLevel>(*policy.FindIntKey("level"))) {
+    case POLICY_LEVEL_RECOMMENDED:
+      return em::Policy_PolicyLevel_LEVEL_RECOMMENDED;
+    case POLICY_LEVEL_MANDATORY:
+      return em::Policy_PolicyLevel_LEVEL_MANDATORY;
+  }
+  NOTREACHED() << "Invalid policy level: " << *policy.FindIntKey("level");
+  return em::Policy_PolicyLevel_LEVEL_UNKNOWN;
+}
+
+em::Policy_PolicyScope GetScope(const base::Value& policy) {
+  switch (static_cast<PolicyScope>(*policy.FindIntKey("scope"))) {
+    case POLICY_SCOPE_USER:
+      return em::Policy_PolicyScope_SCOPE_USER;
+    case POLICY_SCOPE_MACHINE:
+      return em::Policy_PolicyScope_SCOPE_MACHINE;
+  }
+  NOTREACHED() << "Invalid policy scope: " << *policy.FindIntKey("scope");
+  return em::Policy_PolicyScope_SCOPE_UNKNOWN;
+}
+
+em::Policy_PolicySource GetSource(const base::Value& policy) {
+  switch (static_cast<PolicySource>(*policy.FindIntKey("source"))) {
+    case POLICY_SOURCE_ENTERPRISE_DEFAULT:
+      return em::Policy_PolicySource_SOURCE_ENTERPRISE_DEFAULT;
+    case POLICY_SOURCE_CLOUD:
+      return em::Policy_PolicySource_SOURCE_CLOUD;
+    case POLICY_SOURCE_ACTIVE_DIRECTORY:
+      return em::Policy_PolicySource_SOURCE_ACTIVE_DIRECTORY;
+    case POLICY_SOURCE_DEVICE_LOCAL_ACCOUNT_OVERRIDE:
+      return em::Policy_PolicySource_SOURCE_DEVICE_LOCAL_ACCOUNT_OVERRIDE;
+    case POLICY_SOURCE_PLATFORM:
+      return em::Policy_PolicySource_SOURCE_PLATFORM;
+    case POLICY_SOURCE_PRIORITY_CLOUD:
+      return em::Policy_PolicySource_SOURCE_PRIORITY_CLOUD;
+    case POLICY_SOURCE_MERGED:
+      return em::Policy_PolicySource_SOURCE_MERGED;
+    case POLICY_SOURCE_COUNT:
+      NOTREACHED();
+      return em::Policy_PolicySource_SOURCE_UNKNOWN;
+  }
+  NOTREACHED() << "Invalid policy source: " << *policy.FindIntKey("source");
+  return em::Policy_PolicySource_SOURCE_UNKNOWN;
+}
+
+}  // namespace
+
+void AppendChromePolicyInfoIntoProfileReport(
+    const base::Value& policies,
+    em::ChromeUserProfileInfo* profile_info) {
+  for (const auto& item : policies.FindKey("chromePolicies")->DictItems()) {
+    const base::Value& policy = item.second;
+    auto* policy_info = profile_info->add_chrome_policies();
+    policy_info->set_name(item.first);
+    policy_info->set_level(GetLevel(policy));
+    policy_info->set_scope(GetScope(policy));
+    policy_info->set_source(GetSource(policy));
+    base::JSONWriter::Write(*policy.FindKey("value"),
+                            policy_info->mutable_value());
+    const std::string* error = policy.FindStringKey("error");
+    if (error)
+      policy_info->set_error(*error);
+  }
+}
+
+}  // namespace enterprise_reporting
diff --git a/chrome/browser/enterprise_reporting/policy_info.h b/chrome/browser/enterprise_reporting/policy_info.h
new file mode 100644
index 0000000..6a3dfae
--- /dev/null
+++ b/chrome/browser/enterprise_reporting/policy_info.h
@@ -0,0 +1,24 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ENTERPRISE_REPORTING_POLICY_INFO_H_
+#define CHROME_BROWSER_ENTERPRISE_REPORTING_POLICY_INFO_H_
+
+#include "components/policy/proto/device_management_backend.pb.h"
+
+namespace em = enterprise_management;
+
+namespace base {
+class Value;
+}
+
+namespace enterprise_reporting {
+
+void AppendChromePolicyInfoIntoProfileReport(
+    const base::Value& policies,
+    em::ChromeUserProfileInfo* profile_info);
+
+}  // namespace enterprise_reporting
+
+#endif  // CHROME_BROWSER_ENTERPRISE_REPORTING_POLICY_INFO_H_
diff --git a/chrome/browser/enterprise_reporting/policy_info_unittest.cc b/chrome/browser/enterprise_reporting/policy_info_unittest.cc
new file mode 100644
index 0000000..c95422a
--- /dev/null
+++ b/chrome/browser/enterprise_reporting/policy_info_unittest.cc
@@ -0,0 +1,93 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/enterprise_reporting/policy_info.h"
+
+#include "chrome/browser/policy/policy_conversions.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/policy/core/common/mock_policy_service.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/proto/device_management_backend.pb.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace em = enterprise_management;
+
+namespace enterprise_reporting {
+namespace {
+constexpr char kPolicyName1[] = "policy_a";
+constexpr char kPolicyName2[] = "policy_b";
+}  // namespace
+
+using ::testing::_;
+using ::testing::Eq;
+
+class PolicyInfoTest : public ::testing::Test {
+ public:
+  void SetUp() override {
+    TestingProfile::Builder builder;
+    builder.SetPolicyService(GetPolicyService());
+    profile_ = builder.Build();
+  }
+
+  std::unique_ptr<policy::MockPolicyService> GetPolicyService() {
+    auto policy_service = std::make_unique<policy::MockPolicyService>();
+    ON_CALL(*policy_service.get(),
+            GetPolicies(Eq(policy::PolicyNamespace(policy::POLICY_DOMAIN_CHROME,
+                                                   std::string()))))
+        .WillByDefault(::testing::ReturnRef(policy_map_));
+    policy_service_ = policy_service.get();
+    return policy_service;
+  }
+
+  TestingProfile* profile() { return profile_.get(); }
+  policy::PolicyMap* policy_map() { return &policy_map_; }
+  policy::MockPolicyService* policy_service() { return policy_service_; }
+
+ private:
+  content::TestBrowserThreadBundle thread_bundle_;
+  std::unique_ptr<TestingProfile> profile_;
+  policy::PolicyMap policy_map_;
+  policy::MockPolicyService* policy_service_;
+};
+
+// Verify two Chrome policies are appended to the Profile report properly.
+TEST_F(PolicyInfoTest, ChromePolicy) {
+  policy_map()->Set(kPolicyName1, policy::POLICY_LEVEL_MANDATORY,
+                    policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
+                    std::make_unique<base::Value>(std::vector<base::Value>()),
+                    nullptr);
+  policy_map()->Set(kPolicyName2, policy::POLICY_LEVEL_RECOMMENDED,
+                    policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_MERGED,
+                    std::make_unique<base::Value>(true), nullptr);
+  em::ChromeUserProfileInfo profile_info;
+
+  EXPECT_CALL(*policy_service(), GetPolicies(_));
+
+  AppendChromePolicyInfoIntoProfileReport(
+      policy::GetAllPolicyValuesAsDictionary(
+          profile(), /* with_user_policies */ true, /* convert_values */ false,
+          /* with_device_data*/ false,
+          /* is_pretty_print */ false, /* convert_types */ false),
+      &profile_info);
+  EXPECT_EQ(2, profile_info.chrome_policies_size());
+
+  auto policy1 = profile_info.chrome_policies(0);
+  EXPECT_EQ(kPolicyName1, policy1.name());
+  EXPECT_EQ("[]", policy1.value());
+  EXPECT_EQ(em::Policy_PolicyLevel_LEVEL_MANDATORY, policy1.level());
+  EXPECT_EQ(em::Policy_PolicyScope_SCOPE_USER, policy1.scope());
+  EXPECT_EQ(em::Policy_PolicySource_SOURCE_CLOUD, policy1.source());
+  EXPECT_NE("", policy1.error());
+
+  auto policy2 = profile_info.chrome_policies(1);
+  EXPECT_EQ(kPolicyName2, policy2.name());
+  EXPECT_EQ("true", policy2.value());
+  EXPECT_EQ(em::Policy_PolicyLevel_LEVEL_RECOMMENDED, policy2.level());
+  EXPECT_EQ(em::Policy_PolicyScope_SCOPE_MACHINE, policy2.scope());
+  EXPECT_EQ(em::Policy_PolicySource_SOURCE_MERGED, policy2.source());
+  EXPECT_NE("", policy2.error());
+}
+
+}  // namespace enterprise_reporting
diff --git a/chrome/browser/enterprise_reporting/profile_report_generator.cc b/chrome/browser/enterprise_reporting/profile_report_generator.cc
index 5236551..5300fa4d 100644
--- a/chrome/browser/enterprise_reporting/profile_report_generator.cc
+++ b/chrome/browser/enterprise_reporting/profile_report_generator.cc
@@ -9,6 +9,8 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/enterprise_reporting/extension_info.h"
+#include "chrome/browser/enterprise_reporting/policy_info.h"
+#include "chrome/browser/policy/policy_conversions.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
@@ -54,6 +56,15 @@
   GetExtensionInfo();
   GetPluginInfo();
 
+  if (policies_enabled_) {
+    // TODO(crbug.com/983151): Upload policy error as their IDs.
+    policies_ = policy::GetAllPolicyValuesAsDictionary(
+        profile_, /* with_user_policies */ true, /* convert_values */ false,
+        /* with_device_data*/ false,
+        /* is_pretty_print */ false, /* convert_types */ false);
+    GetChromePolicyInfo();
+  }
+
   CheckReportStatusAsync();
   return;
 }
@@ -85,6 +96,10 @@
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
+void ProfileReportGenerator::GetChromePolicyInfo() {
+  AppendChromePolicyInfoIntoProfileReport(policies_, report_.get());
+}
+
 void ProfileReportGenerator::OnPluginsLoaded(
     const std::vector<content::WebPluginInfo>& plugins) {
   for (auto plugin : plugins) {
diff --git a/chrome/browser/enterprise_reporting/profile_report_generator.h b/chrome/browser/enterprise_reporting/profile_report_generator.h
index 3f50659d..9d0b9b30 100644
--- a/chrome/browser/enterprise_reporting/profile_report_generator.h
+++ b/chrome/browser/enterprise_reporting/profile_report_generator.h
@@ -8,6 +8,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/values.h"
 #include "components/policy/proto/device_management_backend.pb.h"
 
 namespace em = enterprise_management;
@@ -51,7 +52,7 @@
 
   void GetExtensionInfo();
   void GetPluginInfo();
-  // TODO(zmin): void GetChromePolicyInfo();
+  void GetChromePolicyInfo();
   // TODO(zmin): void GetExtensionPolicyInfo();
   // TODO(zmin): void GetPolicyFetchTimestampInfo();
 
@@ -62,6 +63,7 @@
   void CheckReportStatusAsync();
 
   Profile* profile_;
+  base::Value policies_;
 
   bool extensions_and_plugins_enabled_ = true;
   bool policies_enabled_ = true;
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
index 6d292f4e..b1a603a4 100644
--- a/chrome/browser/extensions/crx_installer.cc
+++ b/chrome/browser/extensions/crx_installer.cc
@@ -482,9 +482,6 @@
   UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackFailureInstallSource",
                             install_source(), Manifest::NUM_LOCATIONS);
 
-  UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackFailureInstallCause",
-                            install_cause(),
-                            extension_misc::NUM_INSTALL_CAUSES);
   ReportFailureFromFileThread(error);
 }
 
@@ -501,10 +498,6 @@
                             install_source(), Manifest::NUM_LOCATIONS);
 
 
-  UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackSuccessInstallCause",
-                            install_cause(),
-                            extension_misc::NUM_INSTALL_CAUSES);
-
   extension_ = extension;
   temp_dir_ = temp_dir;
   dnr_ruleset_checksum_ = dnr_ruleset_checksum;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index da706346..ffaa277 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -851,11 +851,6 @@
     "expiry_milestone": 76
   },
   {
-    "name": "enable-assistant-voice-match",
-    "owners": [ "croissant-eng" ],
-    "expiry_milestone": 76
-  },
-  {
     "name": "enable-async-dns",
     "owners": [ "ericorth", "net-dev" ],
     "expiry_milestone": 81
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index e0768e8..61ff6a1c 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3137,10 +3137,6 @@
 const char kEnableAssistantMediaSessionIntegrationDescription[] =
     "Enable Assistant Media Session Integration.";
 
-const char kEnableAssistantVoiceMatchName[] = "Enable Assistant Voice Match";
-const char kEnableAssistantVoiceMatchDescription[] =
-    "Enable the Assistant Voice Match feature";
-
 const char kEnableBackgroundBlurName[] = "Enable background blur.";
 const char kEnableBackgroundBlurDescription[] =
     "Enables background blur for the Launcher and Shelf.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 6e5f67ca..379a33c 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1875,9 +1875,6 @@
 extern const char kEnableAssistantMediaSessionIntegrationName[];
 extern const char kEnableAssistantMediaSessionIntegrationDescription[];
 
-extern const char kEnableAssistantVoiceMatchName[];
-extern const char kEnableAssistantVoiceMatchDescription[];
-
 extern const char kEnableBackgroundBlurName[];
 extern const char kEnableBackgroundBlurDescription[];
 
diff --git a/chrome/browser/notifications/scheduler/internal/BUILD.gn b/chrome/browser/notifications/scheduler/internal/BUILD.gn
index ff10cac..d956686 100644
--- a/chrome/browser/notifications/scheduler/internal/BUILD.gn
+++ b/chrome/browser/notifications/scheduler/internal/BUILD.gn
@@ -37,6 +37,8 @@
     "impression_types.h",
     "init_aware_scheduler.cc",
     "init_aware_scheduler.h",
+    "noop_notification_schedule_service.cc",
+    "noop_notification_schedule_service.h",
     "notification_entry.cc",
     "notification_entry.h",
     "notification_schedule_service_impl.cc",
diff --git a/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.cc b/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.cc
new file mode 100644
index 0000000..54f7d8a
--- /dev/null
+++ b/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.cc
@@ -0,0 +1,50 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.h"
+
+#include "chrome/browser/notifications/scheduler/public/notification_params.h"
+
+namespace notifications {
+
+NoopNotificationScheduleService::NoopNotificationScheduleService() = default;
+
+NoopNotificationScheduleService::~NoopNotificationScheduleService() = default;
+
+void NoopNotificationScheduleService::Schedule(
+    std::unique_ptr<NotificationParams> notification_params) {}
+
+void NoopNotificationScheduleService::DeleteNotifications(
+    SchedulerClientType type) {}
+
+void NoopNotificationScheduleService::GetImpressionDetail(
+    SchedulerClientType,
+    ImpressionDetail::ImpressionDetailCallback callback) {}
+
+NotificationBackgroundTaskScheduler::Handler*
+NoopNotificationScheduleService::GetBackgroundTaskSchedulerHandler() {
+  return this;
+}
+
+UserActionHandler* NoopNotificationScheduleService::GetUserActionHandler() {
+  return this;
+}
+
+void NoopNotificationScheduleService::OnStartTask(
+    SchedulerTaskTime task_time,
+    TaskFinishedCallback callback) {}
+
+void NoopNotificationScheduleService::OnStopTask(SchedulerTaskTime task_time) {}
+
+void NoopNotificationScheduleService::OnClick(
+    const std::string& notification_id) {}
+
+void NoopNotificationScheduleService::OnActionClick(
+    const std::string& notification_id,
+    ActionButtonType button_type) {}
+
+void NoopNotificationScheduleService::OnDismiss(
+    const std::string& notification_id) {}
+
+}  // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.h b/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.h
new file mode 100644
index 0000000..245a756
--- /dev/null
+++ b/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.h
@@ -0,0 +1,49 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_INTERNAL_NOOP_NOTIFICATION_SCHEDULE_SERVICE_H_
+#define CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_INTERNAL_NOOP_NOTIFICATION_SCHEDULE_SERVICE_H_
+
+#include "chrome/browser/notifications/scheduler/public/notification_schedule_service.h"
+#include "chrome/browser/notifications/scheduler/public/user_action_handler.h"
+
+namespace notifications {
+
+class NoopNotificationScheduleService
+    : public NotificationScheduleService,
+      public NotificationBackgroundTaskScheduler::Handler,
+      public UserActionHandler {
+ public:
+  NoopNotificationScheduleService();
+  ~NoopNotificationScheduleService() override;
+
+ private:
+  // NotificationScheduleService implementation.
+  void Schedule(
+      std::unique_ptr<NotificationParams> notification_params) override;
+  void DeleteNotifications(SchedulerClientType type) override;
+  void GetImpressionDetail(
+      SchedulerClientType,
+      ImpressionDetail::ImpressionDetailCallback callback) override;
+  NotificationBackgroundTaskScheduler::Handler*
+  GetBackgroundTaskSchedulerHandler() override;
+  UserActionHandler* GetUserActionHandler() override;
+
+  // NotificationBackgroundTaskScheduler::Handler implementation.
+  void OnStartTask(SchedulerTaskTime task_time,
+                   TaskFinishedCallback callback) override;
+  void OnStopTask(SchedulerTaskTime task_time) override;
+
+  // UserActionHandler implementation.
+  void OnClick(const std::string& notification_id) override;
+  void OnActionClick(const std::string& notification_id,
+                     ActionButtonType button_type) override;
+  void OnDismiss(const std::string& notification_id) override;
+
+  DISALLOW_COPY_AND_ASSIGN(NoopNotificationScheduleService);
+};
+
+}  // namespace notifications
+
+#endif  // CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_INTERNAL_NOOP_NOTIFICATION_SCHEDULE_SERVICE_H_
diff --git a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc
index 0c173de..ae15e3ebc 100644
--- a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc
+++ b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/bind.h"
 #include "base/logging.h"
 #include "chrome/browser/notifications/scheduler/internal/notification_scheduler.h"
 #include "chrome/browser/notifications/scheduler/public/notification_params.h"
@@ -14,7 +15,11 @@
 
 NotificationScheduleServiceImpl::NotificationScheduleServiceImpl(
     std::unique_ptr<NotificationScheduler> scheduler)
-    : scheduler_(std::move(scheduler)) {}
+    : scheduler_(std::move(scheduler)) {
+  scheduler_->Init(
+      base::BindOnce(&NotificationScheduleServiceImpl::OnInitialized,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
 
 NotificationScheduleServiceImpl::~NotificationScheduleServiceImpl() = default;
 
@@ -69,4 +74,9 @@
   scheduler_->OnDismiss(notification_id);
 }
 
+void NotificationScheduleServiceImpl::OnInitialized(bool success) {
+  // TODO(xingliu): Track metric here.
+  NOTIMPLEMENTED();
+}
+
 }  // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h
index 3815519..0830660c 100644
--- a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h
+++ b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
 #include "chrome/browser/notifications/scheduler/public/notification_schedule_service.h"
 #include "chrome/browser/notifications/scheduler/public/user_action_handler.h"
 
@@ -49,9 +50,13 @@
                      ActionButtonType button_type) override;
   void OnDismiss(const std::string& notification_id) override;
 
+  // Called after initialization is done.
+  void OnInitialized(bool success);
+
   // Provides the actual notification scheduling functionalities.
   std::unique_ptr<NotificationScheduler> scheduler_;
 
+  base::WeakPtrFactory<NotificationScheduleServiceImpl> weak_ptr_factory_{this};
   DISALLOW_COPY_AND_ASSIGN(NotificationScheduleServiceImpl);
 };
 
diff --git a/chrome/browser/notifications/scheduler/public/BUILD.gn b/chrome/browser/notifications/scheduler/public/BUILD.gn
index b5a1c01..67fd6f8 100644
--- a/chrome/browser/notifications/scheduler/public/BUILD.gn
+++ b/chrome/browser/notifications/scheduler/public/BUILD.gn
@@ -12,6 +12,8 @@
   sources = [
     "display_agent.cc",
     "display_agent.h",
+    "features.cc",
+    "features.h",
     "impression_detail.cc",
     "impression_detail.h",
     "notification_background_task_scheduler.h",
diff --git a/chrome/browser/notifications/scheduler/public/features.cc b/chrome/browser/notifications/scheduler/public/features.cc
new file mode 100644
index 0000000..6c70b11
--- /dev/null
+++ b/chrome/browser/notifications/scheduler/public/features.cc
@@ -0,0 +1,14 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/notifications/scheduler/public/features.h"
+
+namespace notifications {
+namespace features {
+
+const base::Feature kNotificationScheduleService{
+    "NotificationScheduleService", base::FEATURE_DISABLED_BY_DEFAULT};
+
+}  // namespace features
+}  // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/public/features.h b/chrome/browser/notifications/scheduler/public/features.h
new file mode 100644
index 0000000..0e84b11
--- /dev/null
+++ b/chrome/browser/notifications/scheduler/public/features.h
@@ -0,0 +1,19 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_PUBLIC_FEATURES_H_
+#define CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_PUBLIC_FEATURES_H_
+
+#include "base/feature_list.h"
+
+namespace notifications {
+namespace features {
+
+// The feature to enable NotificationScheduleService.
+extern const base::Feature kNotificationScheduleService;
+
+}  // namespace features
+}  // namespace notifications
+
+#endif  // CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_PUBLIC_FEATURES_H_
diff --git a/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc b/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc
index c46c331..9b49958 100644
--- a/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc
+++ b/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/notifications/scheduler/internal/impression_history_tracker.h"
 #include "chrome/browser/notifications/scheduler/internal/impression_store.h"
 #include "chrome/browser/notifications/scheduler/internal/init_aware_scheduler.h"
+#include "chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.h"
 #include "chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h"
 #include "chrome/browser/notifications/scheduler/internal/notification_scheduler_context.h"
 #include "chrome/browser/notifications/scheduler/internal/notification_store.h"
@@ -22,6 +23,7 @@
 #include "chrome/browser/notifications/scheduler/internal/scheduler_config.h"
 #include "chrome/browser/notifications/scheduler/internal/webui_client.h"
 #include "chrome/browser/notifications/scheduler/public/display_agent.h"
+#include "chrome/browser/notifications/scheduler/public/features.h"
 #include "chrome/browser/notifications/scheduler/public/notification_background_task_scheduler.h"
 #include "chrome/browser/notifications/scheduler/public/notification_scheduler_client_registrar.h"
 #include "components/leveldb_proto/public/proto_database_provider.h"
@@ -43,6 +45,9 @@
     std::unique_ptr<DisplayAgent> display_agent,
     leveldb_proto::ProtoDatabaseProvider* db_provider,
     const base::FilePath& storage_dir) {
+  if (!base::FeatureList::IsEnabled(features::kNotificationScheduleService))
+    return static_cast<KeyedService*>(new NoopNotificationScheduleService());
+
   auto config = SchedulerConfig::Create();
   auto task_runner = base::CreateSequencedTaskRunnerWithTraits(
       {base::MayBlock(), base::TaskPriority::BEST_EFFORT});
diff --git a/chrome/browser/policy/OWNERS b/chrome/browser/policy/OWNERS
index 1f757aed..4d55e12 100644
--- a/chrome/browser/policy/OWNERS
+++ b/chrome/browser/policy/OWNERS
@@ -5,6 +5,7 @@
 pmarko@chromium.org
 poromov@chromium.org
 rsorokin@chromium.org
+zmin@chromium.org
 
 per-file *browser_dm_token_storage*=rogerta@chromium.org
 per-file *browser_dm_token_storage*=zmin@chromium.org
diff --git a/chrome/browser/policy/e2e_test/tests/__init__.py b/chrome/browser/policy/e2e_test/tests/__init__.py
index 7e6463f..8b8d8ce 100644
--- a/chrome/browser/policy/e2e_test/tests/__init__.py
+++ b/chrome/browser/policy/e2e_test/tests/__init__.py
@@ -5,6 +5,7 @@
 from force_google_safe_search.force_google_safe_search import *
 from homepage.homepage import *
 from restore_on_startup.restore_on_startup import *
+from password_manager_enabled.password_manager_enabled import *
 from popups_allowed.popups_allowed import *
 from url_blacklist.url_blacklist import *
 from url_whitelist.url_whitelist import *
diff --git a/chrome/browser/policy/e2e_test/tests/password_manager_enabled/__init__.py b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/__init__.py
diff --git a/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled.py b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled.py
new file mode 100644
index 0000000..ea290e3
--- /dev/null
+++ b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled.py
@@ -0,0 +1,42 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+from chrome_ent_test.ent_tests import ChromeEnterpriseTestCase
+from chrome_ent_test.infra.core import environment, before_all, test
+
+
+@environment(file="../policy_test.asset.textpb")
+class PasswordManagerEnabledTest(ChromeEnterpriseTestCase):
+  """Test the PasswordManagerEnabled policy.
+
+  See https://www.chromium.org/administrators/policy-list-3#PasswordManagerEnabled"""
+
+  @before_all
+  def setup(self):
+    self.InstallChrome('client2012')
+    self.InstallWebDriver('client2012')
+
+  def isPasswordManagerEnabled(self):
+    dir = os.path.dirname(os.path.abspath(__file__))
+    output = self.RunWebDriverTest(
+        'client2012',
+        os.path.join(dir, 'password_manager_enabled_webdriver_test.py'))
+    return "TRUE" in output
+
+  @test
+  def test_PasswordManagerDisabled(self):
+    self.SetPolicy('win2012-dc', 'PasswordManagerEnabled', 0, 'DWORD')
+    self.RunCommand('client2012', 'gpupdate /force')
+
+    enabled = self.isPasswordManagerEnabled()
+    self.assertFalse(enabled)
+
+  @test
+  def test_PasswordManagerEnabled(self):
+    self.SetPolicy('win2012-dc', 'PasswordManagerEnabled', 1, 'DWORD')
+    self.RunCommand('client2012', 'gpupdate /force')
+
+    enabled = self.isPasswordManagerEnabled()
+    self.assertTrue(enabled)
diff --git a/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled_webdriver_test.py b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled_webdriver_test.py
new file mode 100644
index 0000000..320d5a0
--- /dev/null
+++ b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled_webdriver_test.py
@@ -0,0 +1,40 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import test_util
+from absl import app
+
+
+def getShadowDom(driver, root, selector):
+  el = root.find_element_by_css_selector(selector)
+  return driver.execute_script("return arguments[0].shadowRoot", el)
+
+
+def getNestedShadowDom(driver, selectors):
+  el = driver
+  for selector in selectors:
+    el = getShadowDom(driver, el, selector)
+  return el
+
+
+def main(argv):
+  driver = test_util.create_chrome_webdriver()
+  driver.get("chrome://settings/passwords")
+
+  # The settings is nested within multiple shadow doms - extract it.
+  el = getNestedShadowDom(driver, [
+      "settings-ui", "settings-main", "settings-basic-page",
+      "settings-autofill-page", "passwords-section", "#passwordToggle"
+  ])
+
+  if el.find_element_by_css_selector("cr-toggle").get_attribute("checked"):
+    print "TRUE"
+  else:
+    print "FALSE"
+
+  driver.quit()
+
+
+if __name__ == '__main__':
+  app.run(main)
diff --git a/chrome/browser/policy/policy_conversions.cc b/chrome/browser/policy/policy_conversions.cc
index 643a813..0d79ed2 100644
--- a/chrome/browser/policy/policy_conversions.cc
+++ b/chrome/browser/policy/policy_conversions.cc
@@ -129,28 +129,36 @@
 // |known_policy_schemas| contains |Schema|s for known policies in the same
 // policy namespace of |map|. A policy without an entry in
 // |known_policy_schemas| is an unknown policy.
+// When |convert_types| is true, policy types are converted into string. For
+// example, POLICY_SCOPE_USER is converted to 'user'. Otherwise, policy types
+// are returned as integers.
 Value GetPolicyValue(
     const std::string& policy_name,
     const PolicyMap::Entry& policy,
     PolicyErrorMap* errors,
     bool convert_values,
     const base::Optional<PolicyToSchemaMap>& known_policy_schemas,
-    bool is_pretty_print) {
+    bool is_pretty_print,
+    bool convert_types) {
   base::Optional<Schema> known_policy_schema =
       GetKnownPolicySchema(known_policy_schemas, policy_name);
   Value value(Value::Type::DICTIONARY);
   value.SetKey("value",
                CopyAndMaybeConvert(*policy.value, convert_values,
                                    known_policy_schema, is_pretty_print));
-  value.SetKey("scope", Value((policy.scope == POLICY_SCOPE_USER)
-                                  ? "user"
-                                  : ((policy.scope == POLICY_SCOPE_MACHINE)
-                                         ? "machine"
-                                         : "merged")));
-  value.SetKey("level",
-               Value((policy.level == POLICY_LEVEL_RECOMMENDED) ? "recommended"
-                                                                : "mandatory"));
-  value.SetKey("source", Value(kPolicySources[policy.source].name));
+  if (convert_types) {
+    value.SetKey(
+        "scope",
+        Value((policy.scope == POLICY_SCOPE_USER) ? "user" : "machine"));
+    value.SetKey("level", Value(Value((policy.level == POLICY_LEVEL_RECOMMENDED)
+                                          ? "recommended"
+                                          : "mandatory")));
+    value.SetKey("source", Value(kPolicySources[policy.source].name));
+  } else {
+    value.SetKey("scope", Value(policy.scope));
+    value.SetKey("level", Value(policy.level));
+    value.SetKey("source", Value(policy.source));
+  }
   base::string16 error;
   if (!known_policy_schema.has_value()) {
     // We don't know what this policy is. This is an important error to
@@ -187,7 +195,7 @@
     for (const auto& conflict : policy.conflicts) {
       base::Value conflicted_policy_value =
           GetPolicyValue(policy_name, conflict, errors, convert_values,
-                         known_policy_schemas, is_pretty_print);
+                         known_policy_schemas, is_pretty_print, convert_types);
       conflict_values.GetList().push_back(std::move(conflicted_policy_value));
     }
 
@@ -210,7 +218,8 @@
     bool convert_values,
     const base::Optional<PolicyToSchemaMap>& known_policy_schemas,
     Value* values,
-    bool is_pretty_print) {
+    bool is_pretty_print,
+    bool convert_types) {
   DCHECK(values);
   for (const auto& entry : map) {
     const std::string& policy_name = entry.first;
@@ -219,7 +228,7 @@
       continue;
     base::Value value =
         GetPolicyValue(policy_name, policy, errors, convert_values,
-                       known_policy_schemas, is_pretty_print);
+                       known_policy_schemas, is_pretty_print, convert_types);
     values->SetKey(policy_name, std::move(value));
   }
 }
@@ -248,7 +257,8 @@
                            bool keep_user_policies,
                            bool convert_values,
                            Value* values,
-                           bool is_pretty_print) {
+                           bool is_pretty_print,
+                           bool convert_types) {
   PolicyService* policy_service = GetPolicyService(context);
   PolicyMap map;
 
@@ -281,14 +291,15 @@
   GetPolicyValues(
       map, &errors, keep_user_policies, convert_values,
       GetKnownPolicies(schema_map, policy_namespace, is_pretty_print), values,
-      is_pretty_print);
+      is_pretty_print, convert_types);
 }
 
 #if defined(OS_CHROMEOS)
 void GetDeviceLocalAccountPolicies(bool convert_values,
                                    Value* values,
                                    bool with_device_data,
-                                   bool is_pretty_print) {
+                                   bool is_pretty_print,
+                                   bool convert_types) {
   // DeviceLocalAccount policies are only available for affiliated users and for
   // system logs.
   if (!with_device_data &&
@@ -349,7 +360,7 @@
     GetPolicyValues(
         map, &errors, true, convert_values,
         GetKnownPolicies(schema_map, policy_namespace, is_pretty_print),
-        &current_account_policies, is_pretty_print);
+        &current_account_policies, is_pretty_print, convert_types);
 
     if (values->is_list()) {
       Value current_account_policies_data(Value::Type::DICTIONARY);
@@ -383,7 +394,8 @@
                                 bool with_user_policies,
                                 bool convert_values,
                                 bool with_device_data,
-                                bool is_pretty_print) {
+                                bool is_pretty_print,
+                                bool convert_types) {
   Value all_policies(Value::Type::LIST);
   DCHECK(context);
 
@@ -392,7 +404,7 @@
   // Add Chrome policy values.
   Value chrome_policies(Value::Type::DICTIONARY);
   GetChromePolicyValues(context, with_user_policies, convert_values,
-                        &chrome_policies, is_pretty_print);
+                        &chrome_policies, is_pretty_print, convert_types);
   Value chrome_policies_data(Value::Type::DICTIONARY);
   chrome_policies_data.SetKey("name", Value("Chrome Policies"));
   chrome_policies_data.SetKey("policies", std::move(chrome_policies));
@@ -431,7 +443,7 @@
         GetPolicyService(context)->GetPolicies(policy_namespace),
         &empty_error_map, with_user_policies, convert_values,
         GetKnownPolicies(schema_map, policy_namespace, is_pretty_print),
-        &extension_policies, is_pretty_print);
+        &extension_policies, is_pretty_print, convert_types);
     Value extension_policies_data(Value::Type::DICTIONARY);
     extension_policies_data.SetKey("name", Value(extension->name()));
     extension_policies_data.SetKey("id", Value(extension->id()));
@@ -443,7 +455,7 @@
 #if defined(OS_CHROMEOS)
   Value device_local_account_policies(Value::Type::DICTIONARY);
   GetDeviceLocalAccountPolicies(convert_values, &all_policies, with_device_data,
-                                is_pretty_print);
+                                is_pretty_print, convert_types);
 #endif  // defined(OS_CHROMEOS)
 
   return all_policies;
@@ -453,7 +465,8 @@
                                      bool with_user_policies,
                                      bool convert_values,
                                      bool with_device_data,
-                                     bool is_pretty_print) {
+                                     bool is_pretty_print,
+                                     bool convert_types) {
   Value all_policies(Value::Type::DICTIONARY);
   if (!context) {
     LOG(ERROR) << "Can not dump policies, null context";
@@ -465,7 +478,7 @@
   // Add Chrome policy values.
   Value chrome_policies(Value::Type::DICTIONARY);
   GetChromePolicyValues(context, with_user_policies, convert_values,
-                        &chrome_policies, is_pretty_print);
+                        &chrome_policies, is_pretty_print, convert_types);
   all_policies.SetKey("chromePolicies", std::move(chrome_policies));
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
@@ -499,7 +512,7 @@
         GetPolicyService(context)->GetPolicies(policy_namespace),
         &empty_error_map, with_user_policies, convert_values,
         GetKnownPolicies(schema_map, policy_namespace, is_pretty_print),
-        &extension_policies, is_pretty_print);
+        &extension_policies, is_pretty_print, convert_types);
     extension_values.SetKey(extension->id(), std::move(extension_policies));
   }
   all_policies.SetKey("extensionPolicies", std::move(extension_values));
@@ -508,7 +521,8 @@
 #if defined(OS_CHROMEOS)
   Value device_local_account_policies(Value::Type::DICTIONARY);
   GetDeviceLocalAccountPolicies(convert_values, &device_local_account_policies,
-                                with_device_data, is_pretty_print);
+                                with_device_data, is_pretty_print,
+                                convert_types);
   all_policies.SetKey("deviceLocalAccountPolicies",
                       std::move(device_local_account_policies));
 #endif  // defined(OS_CHROMEOS)
@@ -578,7 +592,7 @@
                                      bool is_pretty_print) {
   Value all_policies = GetAllPolicyValuesAsDictionary(
       context, with_user_policies, false /* convert_values */, with_device_data,
-      is_pretty_print);
+      is_pretty_print, true /* convert_types */);
 
   return DictionaryToJSONString(all_policies, is_pretty_print);
 }
diff --git a/chrome/browser/policy/policy_conversions.h b/chrome/browser/policy/policy_conversions.h
index 7b9777c..f1e3b1ff 100644
--- a/chrome/browser/policy/policy_conversions.h
+++ b/chrome/browser/policy/policy_conversions.h
@@ -18,16 +18,21 @@
 
 namespace policy {
 
+// TODO(crbug.com/983174): Refactor the file as these functions have too many
+// parameters.
+
 extern const LocalizedString kPolicySources[POLICY_SOURCE_COUNT];
 
 // Returns an array with the values of all set policies, with some values
 // converted to be shown in javascript, if it is specified.
 // |with_user_policies| governs if values with POLICY_SCOPE_USER are included.
+// |convert_types| governs if policy types are returned as string.
 base::Value GetAllPolicyValuesAsArray(content::BrowserContext* context,
                                       bool with_user_policies,
                                       bool convert_values,
                                       bool with_device_data,
-                                      bool is_pretty_print);
+                                      bool is_pretty_print,
+                                      bool convert_types);
 
 // Returns a dictionary with the values of all set policies, with some values
 // converted to be shown in javascript, if it is specified.
@@ -35,12 +40,14 @@
 // |with_device_data| governs if device identity data (e.g.
 // enrollment client ID) and device local accounts policies are included,
 // it is used in logs uploads to the server.
-// |is_pretty_print| govers if JSON policy value is pretty printed.
+// |is_pretty_print| governs if JSON policy value is pretty printed.
+// |convert_types| governs if policy types are returned as string.
 base::Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context,
                                            bool with_user_policies,
                                            bool convert_values,
                                            bool with_device_data,
-                                           bool is_pretty_print);
+                                           bool is_pretty_print,
+                                           bool convert_types);
 
 // Returns a JSON with the values of all set policies.
 // |with_user_policies| governs if values with POLICY_SCOPE_USER are included.
diff --git a/chrome/browser/printing/printer_manager_dialog.h b/chrome/browser/printing/printer_manager_dialog.h
index 6779a76..a8df6f3 100644
--- a/chrome/browser/printing/printer_manager_dialog.h
+++ b/chrome/browser/printing/printer_manager_dialog.h
@@ -12,6 +12,8 @@
 #error "Printing must be enabled"
 #endif
 
+class Profile;
+
 namespace printing {
 
 // An abstraction of a printer manager dialog. This is used for the printing
@@ -20,7 +22,7 @@
 class PrinterManagerDialog {
  public:
   // Displays the native printer manager dialog.
-  static void ShowPrinterManagerDialog();
+  static void ShowPrinterManagerDialog(Profile* profile);
 
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(PrinterManagerDialog);
diff --git a/chrome/browser/printing/printer_manager_dialog_linux.cc b/chrome/browser/printing/printer_manager_dialog_linux.cc
index 0289ce1..672a6c5c 100644
--- a/chrome/browser/printing/printer_manager_dialog_linux.cc
+++ b/chrome/browser/printing/printer_manager_dialog_linux.cc
@@ -87,7 +87,7 @@
 
 namespace printing {
 
-void PrinterManagerDialog::ShowPrinterManagerDialog() {
+void PrinterManagerDialog::ShowPrinterManagerDialog(Profile* profile) {
   base::PostTaskWithTraits(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING},
       base::BindOnce(&DetectAndOpenPrinterConfigDialog));
diff --git a/chrome/browser/printing/printer_manager_dialog_mac.mm b/chrome/browser/printing/printer_manager_dialog_mac.mm
index 44bfc69..6c58eff1 100644
--- a/chrome/browser/printing/printer_manager_dialog_mac.mm
+++ b/chrome/browser/printing/printer_manager_dialog_mac.mm
@@ -11,7 +11,7 @@
 static NSString* kPrintAndFaxPrefPane =
     @"/System/Library/PreferencePanes/PrintAndFax.prefPane";
 
-void PrinterManagerDialog::ShowPrinterManagerDialog() {
+void PrinterManagerDialog::ShowPrinterManagerDialog(Profile* profile) {
   [[NSWorkspace sharedWorkspace] openFile:kPrintAndFaxPrefPane];
 }
 
diff --git a/chrome/browser/printing/printer_manager_dialog_win.cc b/chrome/browser/printing/printer_manager_dialog_win.cc
index 9ea0e81..3bb3253 100644
--- a/chrome/browser/printing/printer_manager_dialog_win.cc
+++ b/chrome/browser/printing/printer_manager_dialog_win.cc
@@ -12,6 +12,9 @@
 #include "base/path_service.h"
 #include "base/task/post_task.h"
 #include "base/threading/thread.h"
+#include "base/win/windows_version.h"
+#include "chrome/browser/platform_util.h"
+#include "url/gurl.h"
 
 namespace {
 
@@ -32,10 +35,14 @@
 
 namespace printing {
 
-void PrinterManagerDialog::ShowPrinterManagerDialog() {
-  base::PostTaskWithTraits(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING},
-      base::BindOnce(OpenPrintersDialogCallback));
+void PrinterManagerDialog::ShowPrinterManagerDialog(Profile* profile) {
+  if (base::win::GetVersion() >= base::win::Version::WIN10_RS1) {
+    platform_util::OpenExternal(profile, GURL("ms-settings:printers"));
+  } else {
+    base::PostTaskWithTraits(
+        FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING},
+        base::BindOnce(OpenPrintersDialogCallback));
+  }
 }
 
 }  // namespace printing
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index 0ccf7965..6c61fc3 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -116,6 +116,7 @@
 #include "chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h"
 #include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h"
 #include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h"
+#include "chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.h"
 #include "chrome/browser/chromeos/printing/synced_printers_manager_factory.h"
 #include "chrome/browser/chromeos/smb_client/smb_service_factory.h"
 #include "chrome/browser/chromeos/tether/tether_service_factory.h"
@@ -267,6 +268,7 @@
   chromeos::AccountManagerMigratorFactory::GetInstance();
   chromeos::CupsPrintJobManagerFactory::GetInstance();
   chromeos::CupsPrintersManagerFactory::GetInstance();
+  chromeos::CupsProxyServiceManagerFactory::GetInstance();
   chromeos::SyncedPrintersManagerFactory::GetInstance();
   chromeos::smb_client::SmbServiceFactory::GetInstance();
   crostini::CrostiniRegistryServiceFactory::GetInstance();
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 1a0de268..37b90f5 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -179,10 +179,13 @@
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
 #include "chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.h"
 #include "chrome/browser/chromeos/preferences.h"
+#include "chrome/browser/chromeos/printing/cups_proxy_service_delegate_impl.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/secure_channel/secure_channel_client_provider.h"
 #include "chrome/browser/chromeos/settings/device_settings_service.h"
 #include "chrome/browser/signin/chrome_device_id_helper.h"
+#include "chrome/services/cups_proxy/cups_proxy_service.h"
+#include "chrome/services/cups_proxy/public/mojom/constants.mojom.h"
 #include "chromeos/assistant/buildflags.h"
 #include "chromeos/components/account_manager/account_manager.h"
 #include "chromeos/components/account_manager/account_manager_factory.h"
@@ -1328,6 +1331,12 @@
         chromeos::GcmDeviceInfoProviderImpl::GetInstance());
   }
 
+  if (service_name == chromeos::printing::mojom::kCupsProxyServiceName) {
+    return std::make_unique<chromeos::printing::CupsProxyService>(
+        std::move(request),
+        std::make_unique<chromeos::CupsProxyServiceDelegateImpl>());
+  }
+
 #if BUILDFLAG(ENABLE_CROS_ASSISTANT)
   if (service_name == chromeos::assistant::mojom::kServiceName) {
     return std::make_unique<chromeos::assistant::Service>(
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index a0b96dfe..8d1ed7b 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -367,14 +367,6 @@
 #endif
   registrar_.Add(
       this,
-      chrome::NOTIFICATION_BROWSER_OPENED,
-      content::NotificationService::AllSources());
-  registrar_.Add(
-      this,
-      chrome::NOTIFICATION_BROWSER_CLOSED,
-      content::NotificationService::AllSources());
-  registrar_.Add(
-      this,
       chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST,
       content::NotificationService::AllSources());
   registrar_.Add(
@@ -1139,87 +1131,14 @@
       save_active_profiles = true;
       break;
     }
-    case chrome::NOTIFICATION_BROWSER_OPENED: {
-#if defined(OS_ANDROID)
-      NOTREACHED();
-      break;
-#else
-      Browser* browser = content::Source<Browser>(source).ptr();
-      DCHECK(browser);
-      Profile* profile = browser->profile();
-      DCHECK(profile);
-      bool is_ephemeral =
-          profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles);
-      if (!profile->IsOffTheRecord() && !is_ephemeral &&
-          ++browser_counts_[profile] == 1) {
-        active_profiles_.push_back(profile);
-        save_active_profiles = true;
-      }
-      // If browsers are opening, we can't be closing all the browsers. This
-      // can happen if the application was exited, but background mode or
-      // packaged apps prevented the process from shutting down, and then
-      // a new browser window was opened.
-      closing_all_browsers_ = false;
-      break;
-#endif
-    }
-    case chrome::NOTIFICATION_BROWSER_CLOSED: {
-#if defined(OS_ANDROID)
-      NOTREACHED();
-      break;
-#else
-      Browser* browser = content::Source<Browser>(source).ptr();
-      DCHECK(browser);
-      Profile* profile = browser->profile();
-      DCHECK(profile);
-      if (!profile->IsOffTheRecord() && --browser_counts_[profile] == 0) {
-        active_profiles_.erase(std::find(active_profiles_.begin(),
-                                         active_profiles_.end(), profile));
-        save_active_profiles = !closing_all_browsers_;
-      }
-      break;
-#endif
-    }
     default: {
       NOTREACHED();
       break;
     }
   }
 
-  if (save_active_profiles) {
-    PrefService* local_state = g_browser_process->local_state();
-    DCHECK(local_state);
-    ListPrefUpdate update(local_state, prefs::kProfilesLastActive);
-    base::ListValue* profile_list = update.Get();
-
-    profile_list->Clear();
-
-    // crbug.com/120112 -> several non-incognito profiles might have the same
-    // GetPath().BaseName(). In that case, we cannot restore both
-    // profiles. Include each base name only once in the last active profile
-    // list.
-    std::set<std::string> profile_paths;
-    std::vector<Profile*>::const_iterator it;
-    for (it = active_profiles_.begin(); it != active_profiles_.end(); ++it) {
-      // crbug.com/823338 -> CHECK that the profiles aren't guest or incognito,
-      // causing a crash during session restore.
-      CHECK(!(*it)->IsGuestSession())
-          << "Guest profiles shouldn't be saved as active profiles";
-      CHECK(!(*it)->IsOffTheRecord())
-          << "OTR profiles shouldn't be saved as active profiles";
-      std::string profile_path = (*it)->GetPath().BaseName().MaybeAsASCII();
-      // Some profiles might become ephemeral after they are created.
-      // Don't persist the System Profile as one of the last actives, it should
-      // never get a browser.
-      if (!(*it)->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles) &&
-          profile_paths.find(profile_path) == profile_paths.end() &&
-          profile_path !=
-              base::FilePath(chrome::kSystemProfileDir).AsUTF8Unsafe()) {
-        profile_paths.insert(profile_path);
-        profile_list->AppendString(profile_path);
-      }
-    }
-  }
+  if (save_active_profiles)
+    SaveActiveProfiles();
 }
 
 void ProfileManager::OnProfileCreated(Profile* profile,
@@ -1407,6 +1326,14 @@
                                 Profile::CREATE_MODE_ASYNCHRONOUS);
 }
 
+ProfileManager::ProfileInfo::ProfileInfo(std::unique_ptr<Profile> profile,
+                                         bool created)
+    : profile(std::move(profile)), created(created) {}
+
+ProfileManager::ProfileInfo::~ProfileInfo() {
+  ProfileDestroyer::DestroyProfileWhenAppropriate(profile.release());
+}
+
 Profile* ProfileManager::GetActiveUserOrOffTheRecordProfileFromPath(
     const base::FilePath& user_data_dir) {
 #if defined(OS_CHROMEOS)
@@ -1762,15 +1689,86 @@
     callbacks[i].Run(profile, status);
 }
 
-ProfileManager::ProfileInfo::ProfileInfo(std::unique_ptr<Profile> profile,
-                                         bool created)
-    : profile(std::move(profile)), created(created) {}
+void ProfileManager::SaveActiveProfiles() {
+  PrefService* local_state = g_browser_process->local_state();
+  DCHECK(local_state);
+  ListPrefUpdate update(local_state, prefs::kProfilesLastActive);
+  base::ListValue* profile_list = update.Get();
 
-ProfileManager::ProfileInfo::~ProfileInfo() {
-  ProfileDestroyer::DestroyProfileWhenAppropriate(profile.release());
+  profile_list->Clear();
+
+  // crbug.com/120112 -> several non-incognito profiles might have the same
+  // GetPath().BaseName(). In that case, we cannot restore both
+  // profiles. Include each base name only once in the last active profile
+  // list.
+  std::set<std::string> profile_paths;
+  std::vector<Profile*>::const_iterator it;
+  for (it = active_profiles_.begin(); it != active_profiles_.end(); ++it) {
+    // crbug.com/823338 -> CHECK that the profiles aren't guest or incognito,
+    // causing a crash during session restore.
+    CHECK(!(*it)->IsGuestSession())
+        << "Guest profiles shouldn't be saved as active profiles";
+    CHECK(!(*it)->IsOffTheRecord())
+        << "OTR profiles shouldn't be saved as active profiles";
+    std::string profile_path = (*it)->GetPath().BaseName().MaybeAsASCII();
+    // Some profiles might become ephemeral after they are created.
+    // Don't persist the System Profile as one of the last actives, it should
+    // never get a browser.
+    if (!(*it)->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles) &&
+        profile_paths.find(profile_path) == profile_paths.end() &&
+        profile_path !=
+            base::FilePath(chrome::kSystemProfileDir).AsUTF8Unsafe()) {
+      profile_paths.insert(profile_path);
+      profile_list->AppendString(profile_path);
+    }
+  }
 }
 
 #if !defined(OS_ANDROID)
+void ProfileManager::OnBrowserOpened(Browser* browser) {
+  DCHECK(browser);
+  Profile* profile = browser->profile();
+  DCHECK(profile);
+  bool is_ephemeral =
+      profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles);
+  if (!profile->IsOffTheRecord() && !is_ephemeral &&
+      ++browser_counts_[profile] == 1) {
+    active_profiles_.push_back(profile);
+    SaveActiveProfiles();
+  }
+  // If browsers are opening, we can't be closing all the browsers. This
+  // can happen if the application was exited, but background mode or
+  // packaged apps prevented the process from shutting down, and then
+  // a new browser window was opened.
+  closing_all_browsers_ = false;
+}
+
+void ProfileManager::OnBrowserClosed(Browser* browser) {
+  Profile* profile = browser->profile();
+  DCHECK(profile);
+  if (!profile->IsOffTheRecord() && --browser_counts_[profile] == 0) {
+    active_profiles_.erase(
+        std::find(active_profiles_.begin(), active_profiles_.end(), profile));
+    if (!closing_all_browsers_)
+      SaveActiveProfiles();
+  }
+
+  Profile* original_profile = profile->GetOriginalProfile();
+  // Do nothing if the closed window is not the last window of the same profile.
+  for (auto* browser_iter : *BrowserList::GetInstance()) {
+    if (browser_iter->profile()->GetOriginalProfile() == original_profile)
+      return;
+  }
+
+  base::FilePath path = profile->GetPath();
+  if (IsProfileDirectoryMarkedForDeletion(path)) {
+    // Do nothing if the profile is already being deleted.
+  } else if (profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles)) {
+    // Delete if the profile is an ephemeral profile.
+    ScheduleForcedEphemeralProfileForDeletion(path);
+  }
+}
+
 void ProfileManager::UpdateLastUser(Profile* last_active) {
   PrefService* local_state = g_browser_process->local_state();
   DCHECK(local_state);
@@ -1801,27 +1799,13 @@
   BrowserList::RemoveObserver(this);
 }
 
-void ProfileManager::BrowserListObserver::OnBrowserAdded(
-    Browser* browser) {}
+void ProfileManager::BrowserListObserver::OnBrowserAdded(Browser* browser) {
+  profile_manager_->OnBrowserOpened(browser);
+}
 
 void ProfileManager::BrowserListObserver::OnBrowserRemoved(
     Browser* browser) {
-  Profile* profile = browser->profile();
-  Profile* original_profile = profile->GetOriginalProfile();
-  // Do nothing if the closed window is not the last window of the same profile.
-  for (auto* browser : *BrowserList::GetInstance()) {
-    if (browser->profile()->GetOriginalProfile() == original_profile)
-      return;
-  }
-
-  base::FilePath path = profile->GetPath();
-  if (IsProfileDirectoryMarkedForDeletion(path)) {
-    // Do nothing if the profile is already being deleted.
-  } else if (profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles)) {
-    // Delete if the profile is an ephemeral profile.
-    g_browser_process->profile_manager()
-        ->ScheduleForcedEphemeralProfileForDeletion(path);
-  }
+  profile_manager_->OnBrowserClosed(browser);
 }
 
 void ProfileManager::BrowserListObserver::OnBrowserSetLastActive(
diff --git a/chrome/browser/profiles/profile_manager.h b/chrome/browser/profiles/profile_manager.h
index 4b4fa3f..985c6445 100644
--- a/chrome/browser/profiles/profile_manager.h
+++ b/chrome/browser/profiles/profile_manager.h
@@ -358,7 +358,12 @@
                     Profile* profile,
                     Profile::CreateStatus status);
 
+  void SaveActiveProfiles();
+
 #if !defined(OS_ANDROID)
+  void OnBrowserOpened(Browser* browser);
+  void OnBrowserClosed(Browser* browser);
+
   // Updates the last active user of the current session.
   // On Chrome OS updating this user will have no effect since when browser is
   // restored after crash there's another preference that is taken into account.
diff --git a/chrome/browser/renderer_context_menu/mock_render_view_context_menu.cc b/chrome/browser/renderer_context_menu/mock_render_view_context_menu.cc
index d8b2535..16e10342 100644
--- a/chrome/browser/renderer_context_menu/mock_render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/mock_render_view_context_menu.cc
@@ -58,6 +58,20 @@
   items_.push_back(item);
 }
 
+void MockRenderViewContextMenu::AddMenuItemWithIcon(
+    int command_id,
+    const base::string16& title,
+    const gfx::ImageSkia& image) {
+  MockMenuItem item;
+  item.command_id = command_id;
+  item.enabled = observer_->IsCommandIdEnabled(command_id);
+  item.checked = false;
+  item.hidden = false;
+  item.title = title;
+  item.icon = gfx::Image(image);
+  items_.push_back(item);
+}
+
 void MockRenderViewContextMenu::AddCheckItem(int command_id,
                                              const base::string16& title) {
   MockMenuItem item;
@@ -89,6 +103,27 @@
   item.title = label;
   items_.push_back(item);
 
+  AppendSubMenuItems(model);
+}
+
+void MockRenderViewContextMenu::AddSubMenuWithStringIdAndIcon(
+    int command_id,
+    int message_id,
+    ui::MenuModel* model,
+    const gfx::ImageSkia& image) {
+  MockMenuItem item;
+  item.command_id = command_id;
+  item.enabled = observer_->IsCommandIdEnabled(command_id);
+  item.checked = observer_->IsCommandIdChecked(command_id);
+  item.hidden = false;
+  item.title = l10n_util::GetStringUTF16(message_id);
+  item.icon = gfx::Image(image);
+  items_.push_back(item);
+
+  AppendSubMenuItems(model);
+}
+
+void MockRenderViewContextMenu::AppendSubMenuItems(ui::MenuModel* model) {
   // Add items in the submenu |model| to |items_| so that the items can be
   // updated later via the RenderViewContextMenuProxy interface.
   // NOTE: this is a hack for the mock class. Ideally, RVCMProxy should neither
diff --git a/chrome/browser/renderer_context_menu/mock_render_view_context_menu.h b/chrome/browser/renderer_context_menu/mock_render_view_context_menu.h
index 6ce9530..cf31b4c 100644
--- a/chrome/browser/renderer_context_menu/mock_render_view_context_menu.h
+++ b/chrome/browser/renderer_context_menu/mock_render_view_context_menu.h
@@ -52,11 +52,18 @@
 
   // RenderViewContextMenuProxy implementation.
   void AddMenuItem(int command_id, const base::string16& title) override;
+  void AddMenuItemWithIcon(int command_id,
+                           const base::string16& title,
+                           const gfx::ImageSkia& image) override;
   void AddCheckItem(int command_id, const base::string16& title) override;
   void AddSeparator() override;
   void AddSubMenu(int command_id,
                   const base::string16& label,
                   ui::MenuModel* model) override;
+  void AddSubMenuWithStringIdAndIcon(int command_id,
+                                     int message_id,
+                                     ui::MenuModel* model,
+                                     const gfx::ImageSkia& image) override;
   void UpdateMenuItem(int command_id,
                       bool enabled,
                       bool hidden,
@@ -83,6 +90,9 @@
   PrefService* GetPrefs();
 
  private:
+  // Helper function to append items in sub menu from |model|.
+  void AppendSubMenuItems(ui::MenuModel* model);
+
   // An observer used for initializing the status of menu items added in this
   // test. This is owned by our owner and the owner is responsible for its
   // lifetime.
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 2b14fcf..99539e2b 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -56,6 +56,8 @@
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.h"
 #include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h"
+#include "chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h"
+#include "chrome/browser/sharing/click_to_call/click_to_call_utils.h"
 #include "chrome/browser/spellchecker/spellcheck_service.h"
 #include "chrome/browser/translate/chrome_translate_client.h"
 #include "chrome/browser/translate/translate_service.h"
@@ -350,13 +352,15 @@
        {IDC_CONTENT_LINK_SEND_TAB_TO_SELF, 103},
        {IDC_SEND_TAB_TO_SELF_SINGLE_TARGET, 104},
        {IDC_CONTENT_LINK_SEND_TAB_TO_SELF_SINGLE_TARGET, 105},
+       {IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE, 106},
+       {IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES, 107},
        // To add new items:
        //   - Add one more line above this comment block, using the UMA value
        //     from the line below this comment block.
        //   - Increment the UMA value in that latter line.
        //   - Add the new item to the RenderViewContextMenuItem enum in
        //     tools/metrics/histograms/enums.xml.
-       {0, 106}});
+       {0, 108}});
 
   // These UMA values are for the the ContextMenuOptionDesktop enum, used for
   // the ContextMenu.SelectedOptionDesktop histograms.
@@ -1143,6 +1147,8 @@
   if (!params_.link_url.is_empty()) {
     const Browser* browser = GetBrowser();
     const bool in_app = browser && browser->is_app();
+    WebContents* active_web_contents =
+        browser ? browser->tab_strip_model()->GetActiveWebContents() : nullptr;
 
     menu_model_.AddItemWithStringId(
         IDC_CONTENT_CONTEXT_OPENLINKNEWTAB,
@@ -1244,8 +1250,7 @@
     }
 #endif  // !defined(OS_CHROMEOS)
     if (browser && send_tab_to_self::ShouldOfferFeatureForLink(
-                       browser->tab_strip_model()->GetActiveWebContents(),
-                       params_.link_url)) {
+                       active_web_contents, params_.link_url)) {
       send_tab_to_self::RecordSendTabToSelfClickResult(
           send_tab_to_self::kLinkMenu, SendTabToSelfClickResult::kShowItem);
       menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
@@ -1274,7 +1279,7 @@
       } else {
         send_tab_to_self_sub_menu_model_ =
             std::make_unique<send_tab_to_self::SendTabToSelfSubMenuModel>(
-                browser->tab_strip_model()->GetActiveWebContents(),
+                active_web_contents,
                 send_tab_to_self::SendTabToSelfMenuType::kLink,
                 params_.link_url);
 #if defined(OS_MACOSX)
@@ -1290,6 +1295,18 @@
       }
     }
 
+    // Context menu item for click to call.
+    if (active_web_contents &&
+        ShouldOfferClickToCall(active_web_contents->GetBrowserContext(),
+                               params_.link_url)) {
+      if (!click_to_call_context_menu_observer_) {
+        click_to_call_context_menu_observer_ =
+            std::make_unique<ClickToCallContextMenuObserver>(this);
+        observers_.AddObserver(click_to_call_context_menu_observer_.get());
+      }
+      click_to_call_context_menu_observer_->InitMenu(params_);
+    }
+
     menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
     menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVELINKAS,
                                     IDS_CONTENT_CONTEXT_SAVELINKAS);
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.h b/chrome/browser/renderer_context_menu/render_view_context_menu.h
index ab836b9a..49728eb 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.h
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.h
@@ -34,6 +34,7 @@
 #endif
 
 class AccessibilityLabelsMenuObserver;
+class ClickToCallContextMenuObserver;
 class PrintPreviewContextMenuObserver;
 class Profile;
 class SpellingMenuObserver;
@@ -288,6 +289,10 @@
   std::unique_ptr<send_tab_to_self::SendTabToSelfSubMenuModel>
       send_tab_to_self_sub_menu_model_;
 
+  // Click to call menu observer.
+  std::unique_ptr<ClickToCallContextMenuObserver>
+      click_to_call_context_menu_observer_;
+
   DISALLOW_COPY_AND_ASSIGN(RenderViewContextMenu);
 };
 
diff --git a/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc b/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
index 324856b8..29e35fc 100644
--- a/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
+++ b/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
@@ -35,6 +35,7 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/no_renderer_crashes_assertion.h"
+#include "content/public/test/test_navigation_observer.h"
 #include "content/public/test/test_utils.h"
 #include "media/base/media_switches.h"
 #include "net/base/filename_util.h"
@@ -605,14 +606,18 @@
   GURL url(chrome::kChromeUIOmniboxURL);
 
   ui_test_utils::NavigateToURL(browser(), url);
-  ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, WindowOpenDisposition::NEW_BACKGROUND_TAB,
-      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+  WebContents* wc1 = browser()->tab_strip_model()->GetWebContentsAt(0);
+
+  content::WebContentsAddedObserver wc2_observer;
+  content::ExecuteScriptAsync(
+      wc1, content::JsReplace("window.open($1, '_blank')", url));
+  WebContents* wc2 = wc2_observer.GetWebContents();
+  content::TestNavigationObserver nav_observer(wc2, 1);
+  nav_observer.Wait();
 
   EXPECT_EQ(2, browser()->tab_strip_model()->count());
-
-  WebContents* wc1 = browser()->tab_strip_model()->GetWebContentsAt(0);
-  WebContents* wc2 = browser()->tab_strip_model()->GetWebContentsAt(1);
+  EXPECT_EQ(wc1->GetMainFrame()->GetLastCommittedURL(),
+            wc2->GetMainFrame()->GetLastCommittedURL());
   EXPECT_EQ(wc1->GetMainFrame()->GetProcess(),
             wc2->GetMainFrame()->GetProcess());
 
diff --git a/chrome/browser/resources/chromeos/switch_access/BUILD.gn b/chrome/browser/resources/chromeos/switch_access/BUILD.gn
index f0406109b..34438a3 100644
--- a/chrome/browser/resources/chromeos/switch_access/BUILD.gn
+++ b/chrome/browser/resources/chromeos/switch_access/BUILD.gn
@@ -40,7 +40,15 @@
     "icons/decrement.svg",
     "icons/dictation.svg",
     "icons/increment.svg",
+    "icons/jumpToBeginningOfText.svg",
+    "icons/jumpToEndOfText.svg",
     "icons/keyboard.svg",
+    "icons/moveBackwardOneCharOfText.svg",
+    "icons/moveBackwardOneWordOfText.svg",
+    "icons/moveDownOneLineOfText.svg",
+    "icons/moveForwardOneCharOfText.svg",
+    "icons/moveForwardOneWordOfText.svg",
+    "icons/moveUpOneLineOfText.svg",
     "icons/options.svg",
     "icons/scrollDownOrForward.svg",
     "icons/scrollLeft.svg",
@@ -64,6 +72,7 @@
     "switch_access_constants.js",
     "switch_access_predicate.js",
     "text_input_manager.js",
+    "text_navigation_manager.js",
   ]
   rewrite_rules = [
     rebase_path(".", root_build_dir) + ":",
@@ -175,6 +184,7 @@
     ":switch_access_interface",
     ":switch_access_predicate",
     ":text_input_manager",
+    ":text_navigation_manager",
     "../chromevox:constants",
     "../chromevox:tree_walker",
     "../select_to_speak:closure_shim",
@@ -196,6 +206,7 @@
     ":switch_access_constants",
     ":switch_access_predicate",
     ":text_input_manager",
+    ":text_navigation_manager",
     "../chromevox:constants",
     "../chromevox:tree_walker",
   ]
@@ -282,6 +293,7 @@
   externs_list = [
     "$externs_path/automation.js",
     "$externs_path/chrome_extensions.js",
+    "$externs_path/command_line_private.js",
   ]
 }
 
@@ -301,3 +313,10 @@
 js_library("text_input_manager") {
   externs_list = [ "$externs_path/accessibility_private.js" ]
 }
+
+js_library("text_navigation_manager") {
+  deps = [
+    ":switch_access_constants",
+  ]
+  externs_list = [ "$externs_path/accessibility_private.js" ]
+}
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/jumpToBeginningOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/jumpToBeginningOfText.svg
new file mode 100644
index 0000000..4035615
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/icons/jumpToBeginningOfText.svg
@@ -0,0 +1,5 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M9 3v2H7V3zm3.414 6H17v2h-4.586l1.293 1.293-1.414 1.414L9 10l3.293-3.707 1.414 1.414zM9 15v2H7v-2zM5 3v14H3V3zm8 12v2h-2v-2zm4 0v2h-2v-2zm0-12v2h-2V3zm-4 0v2h-2V3z" fill="#E8EAED" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/jumpToEndOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/jumpToEndOfText.svg
new file mode 100644
index 0000000..6df36d5
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/icons/jumpToEndOfText.svg
@@ -0,0 +1,5 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M11 3h2v2h-2zM7.586 9L6.293 7.707l1.414-1.414L11 10l-3.293 3.707-1.414-1.414L7.586 11H3V9zM11 15h2v2h-2zm4-12h2v14h-2zM7 15h2v2H7zm-4 0h2v2H3zM3 3h2v2H3zm4 0h2v2H7z" fill="#E8EAED" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneCharOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneCharOfText.svg
new file mode 100644
index 0000000..f5f16021
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneCharOfText.svg
@@ -0,0 +1,5 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M13 5v10h-2v2h6v-2h-2V5h2V3h-6v2zM9 3H7v2h2zM5 3H3v2h2zm0 12H3v2h2zm1.414-6l1.293-1.293-1.414-1.414L3 10l3.293 3.707 1.414-1.414L6.414 11H11V9zM9 15H7v2h2z" fill="#E8EAED" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneWordOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneWordOfText.svg
new file mode 100644
index 0000000..20902021
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneWordOfText.svg
@@ -0,0 +1,5 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M6.414 9l1.293-1.293-1.414-1.414L3 10l3.293 3.707 1.414-1.414L6.414 11H9V9zM17 3h-6v14h6zm-2 2v10h-2V5zM3 5h6V3H3zm0 10v2h6v-2z" fill="#E8EAED" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveDownOneLineOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveDownOneLineOfText.svg
new file mode 100644
index 0000000..b44fe25
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/icons/moveDownOneLineOfText.svg
@@ -0,0 +1,5 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M17 5H3V3h14zm-6 5.586l1.293-1.293 1.414 1.414L10 14l-3.707-3.293 1.414-1.414L9 10.586V6h2zM17 17H3v-2h14z" fill="#E8EAED" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneCharOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneCharOfText.svg
new file mode 100644
index 0000000..27f8689e9
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneCharOfText.svg
@@ -0,0 +1,5 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5v10h2v2H3v-2h2V5H3V3h6v2zm4-2h2v2h-2zm4 0h2v2h-2zm0 12h2v2h-2zm-1.414-6l-1.293-1.293 1.414-1.414L17 10l-3.293 3.707-1.414-1.414L13.586 11H9V9zM11 15h2v2h-2z" fill="#E8EAED" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneWordOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneWordOfText.svg
new file mode 100644
index 0000000..95ac570
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneWordOfText.svg
@@ -0,0 +1,5 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M13.586 9l-1.293-1.293 1.414-1.414L17 10l-3.293 3.707-1.414-1.414L13.586 11H11V9zM3 3h6v14H3zm2 2v10h2V5zm12 0h-6V3h6zm0 10v2h-6v-2z" fill="#E8EAED" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveUpOneLineOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveUpOneLineOfText.svg
new file mode 100644
index 0000000..3c53d750
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/icons/moveUpOneLineOfText.svg
@@ -0,0 +1,5 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M3 15h14v2H3zm6-5.586l-1.293 1.293-1.414-1.414L10 6l3.707 3.293-1.414 1.414L11 9.414V14H9zM3 3h14v2H3z" fill="#E8EAED" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2 b/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2
index 418712a8..7e70a67 100644
--- a/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2
+++ b/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2
@@ -25,12 +25,14 @@
       "switch_access_constants.js",
       "switch_access_predicate.js",
       "text_input_manager.js",
+      "text_navigation_manager.js",
       "tree_walker.js",
       "background.js"
     ]
   },
   "permissions": [
     "accessibilityPrivate",
+    "commandLinePrivate",
     "storage",
     "tabs"
   ],
diff --git a/chrome/browser/resources/chromeos/switch_access/menu_manager.js b/chrome/browser/resources/chromeos/switch_access/menu_manager.js
index 3baa3e0..fec0e2cb 100644
--- a/chrome/browser/resources/chromeos/switch_access/menu_manager.js
+++ b/chrome/browser/resources/chromeos/switch_access/menu_manager.js
@@ -184,9 +184,19 @@
     if (!this.inMenu_ || !this.node_)
       return false;
 
-    this.clearFocusRing_();
-    this.node_.doDefault();
-    this.exit();
+
+    if (window.switchAccess.textEditingEnabled()) {
+      if (this.node_.role == RoleType.BUTTON) {
+        this.node_.doDefault();
+      } else {
+        this.exit();
+      }
+    } else {
+      this.clearFocusRing_();
+      this.node_.doDefault();
+      this.exit();
+    }
+
     return true;
   }
 
@@ -263,6 +273,18 @@
     if (SwitchAccessPredicate.isTextInput(node)) {
       actions.push(SAConstants.MenuAction.KEYBOARD);
       actions.push(SAConstants.MenuAction.DICTATION);
+
+      if (window.switchAccess.textEditingEnabled() &&
+          node.state[StateType.FOCUSED]) {
+        actions.push(SAConstants.MenuAction.JUMP_TO_BEGINNING_OF_TEXT);
+        actions.push(SAConstants.MenuAction.JUMP_TO_END_OF_TEXT);
+        actions.push(SAConstants.MenuAction.MOVE_BACKWARD_ONE_CHAR_OF_TEXT);
+        actions.push(SAConstants.MenuAction.MOVE_BACKWARD_ONE_WORD_OF_TEXT);
+        actions.push(SAConstants.MenuAction.MOVE_DOWN_ONE_LINE_OF_TEXT);
+        actions.push(SAConstants.MenuAction.MOVE_FORWARD_ONE_CHAR_OF_TEXT);
+        actions.push(SAConstants.MenuAction.MOVE_FORWARD_ONE_WORD_OF_TEXT);
+        actions.push(SAConstants.MenuAction.MOVE_UP_ONE_LINE_OF_TEXT);
+      }
     } else if (actions.length > 0) {
       actions.push(SAConstants.MenuAction.SELECT);
     }
@@ -291,7 +313,13 @@
    * @param {!SAConstants.MenuAction} action
    */
   performAction(action) {
-    this.exit();
+    if (!window.switchAccess.textEditingEnabled()) {
+      this.exit();
+    }
+
+    // Whether or not the menu should exit after performing
+    // the action.
+    let exitAfterAction = true;
 
     switch (action) {
       case SAConstants.MenuAction.SELECT:
@@ -312,9 +340,45 @@
       case SAConstants.MenuAction.SCROLL_RIGHT:
         this.navigationManager_.scroll(action);
         break;
+      case SAConstants.MenuAction.JUMP_TO_BEGINNING_OF_TEXT:
+        this.navigationManager_.jumpToBeginningOfText();
+        exitAfterAction = false;
+        break;
+      case SAConstants.MenuAction.JUMP_TO_END_OF_TEXT:
+        this.navigationManager_.jumpToEndOfText();
+        exitAfterAction = false;
+        break;
+      case SAConstants.MenuAction.MOVE_BACKWARD_ONE_CHAR_OF_TEXT:
+        this.navigationManager_.moveBackwardOneCharOfText();
+        exitAfterAction = false;
+        break;
+      case SAConstants.MenuAction.MOVE_BACKWARD_ONE_WORD_OF_TEXT:
+        this.navigationManager_.moveBackwardOneWordOfText();
+        exitAfterAction = false;
+        break;
+      case SAConstants.MenuAction.MOVE_DOWN_ONE_LINE_OF_TEXT:
+        this.navigationManager_.moveDownOneLineOfText();
+        exitAfterAction = false;
+        break;
+      case SAConstants.MenuAction.MOVE_FORWARD_ONE_CHAR_OF_TEXT:
+        this.navigationManager_.moveForwardOneCharOfText();
+        exitAfterAction = false;
+        break;
+      case SAConstants.MenuAction.MOVE_FORWARD_ONE_WORD_OF_TEXT:
+        this.navigationManager_.moveForwardOneWordOfText();
+        exitAfterAction = false;
+        break;
+      case SAConstants.MenuAction.MOVE_UP_ONE_LINE_OF_TEXT:
+        this.navigationManager_.moveUpOneLineOfText();
+        exitAfterAction = false;
+        break;
       default:
         this.navigationManager_.performActionOnCurrentNode(action);
     }
+
+    if (window.switchAccess.textEditingEnabled() && exitAfterAction) {
+      this.exit();
+    }
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/switch_access/menu_panel.css b/chrome/browser/resources/chromeos/switch_access/menu_panel.css
index cceefe8..df3cd4d9 100644
--- a/chrome/browser/resources/chromeos/switch_access/menu_panel.css
+++ b/chrome/browser/resources/chromeos/switch_access/menu_panel.css
@@ -28,6 +28,11 @@
   padding: 4px;
   width: 80px;
 }
+
+.action.textEditingEnabled {
+  height: 75px;
+}
+
 button.action {
   background: none;
   border: none;
diff --git a/chrome/browser/resources/chromeos/switch_access/menu_panel.html b/chrome/browser/resources/chromeos/switch_access/menu_panel.html
index 82ea3384..0de8669d 100644
--- a/chrome/browser/resources/chromeos/switch_access/menu_panel.html
+++ b/chrome/browser/resources/chromeos/switch_access/menu_panel.html
@@ -54,6 +54,38 @@
       <img src="icons/scrollUpOrBackward.svg">
       <p class="i18n" msgid="scroll_backward"></p>
     </button>
+    <button class="action" id="jumpToBeginningOfText">
+      <img src="icons/jumpToBeginningOfText.svg">
+      <p class="i18n" msgid="jump_to_beginning_of_text"></p>
+    </button>
+    <button class="action" id="jumpToEndOfText">
+      <img src="icons/jumpToEndOfText.svg">
+      <p class="i18n" msgid="jump_to_end_of_text"></p>
+    </button>
+    <button class="action" id="moveBackwardOneCharOfText">
+      <img src="icons/moveBackwardOneCharOfText.svg">
+      <p class="i18n" msgid="move_backward_one_char_of_text"></p>
+    </button>
+    <button class="action" id="moveBackwardOneWordOfText">
+      <img src="icons/moveBackwardOneWordOfText.svg">
+      <p class="i18n" msgid="move_backward_one_word_of_text"></p>
+    </button>
+    <button class="action" id="moveDownOneLineOfText">
+      <img src="icons/moveDownOneLineOfText.svg">
+      <p class="i18n" msgid="move_down_one_line_of_text"></p>
+    </button>
+    <button class="action" id="moveForwardOneCharOfText">
+      <img src="icons/moveForwardOneCharOfText.svg">
+      <p class="i18n" msgid="move_forward_one_char_of_text"></p>
+    </button>
+    <button class="action" id="moveForwardOneWordOfText">
+      <img src="icons/moveForwardOneWordOfText.svg">
+      <p class="i18n" msgid="move_forward_one_word_of_text"></p>
+    </button>
+    <button class="action" id="moveUpOneLineOfText">
+      <img src="icons/moveUpOneLineOfText.svg">
+      <p class="i18n" msgid="move_up_one_line_of_text"></p>
+    </button>
     <button class="action" id="dictation">
       <img src="icons/dictation.svg">
       <p class="i18n" msgid="dictation"></p>
diff --git a/chrome/browser/resources/chromeos/switch_access/menu_panel.js b/chrome/browser/resources/chromeos/switch_access/menu_panel.js
index 40a0a9b6..59dedbe 100644
--- a/chrome/browser/resources/chromeos/switch_access/menu_panel.js
+++ b/chrome/browser/resources/chromeos/switch_access/menu_panel.js
@@ -13,6 +13,12 @@
      * @private {MenuManager}
      */
     this.menuManager_;
+
+    /**
+     * Reference to switch access.
+     * @private {SwitchAccess}
+     */
+    this.switchAccess_;
   }
 
   /**
@@ -37,8 +43,8 @@
    * reference to this object for communication.
    */
   connectToBackground() {
-    const switchAccess = chrome.extension.getBackgroundPage().switchAccess;
-    this.menuManager_ = switchAccess.connectMenuPanel(this);
+    this.switchAccess_ = chrome.extension.getBackgroundPage().switchAccess;
+    this.menuManager_ = this.switchAccess_.connectMenuPanel(this);
   }
 
   /**
@@ -105,7 +111,20 @@
     // TODO(anastasi): This should be a preference that the user can change.
     const maxCols = 3;
     const numRows = Math.ceil(numActions / maxCols);
-    const height = 60 * numRows;
+
+    let rowHeight;
+
+    if (this.switchAccess_.textEditingEnabled()) {
+      rowHeight = 85;
+      const actions = document.getElementsByClassName('action');
+      for (let action of actions) {
+        action.classList.add('textEditingEnabled');
+      }
+    } else {
+      rowHeight = 60;
+    }
+
+    const height = rowHeight * numRows;
     document.getElementById(SAConstants.MENU_ID).style.height = height + 'px';
   }
 
diff --git a/chrome/browser/resources/chromeos/switch_access/navigation_manager.js b/chrome/browser/resources/chromeos/switch_access/navigation_manager.js
index 03ef7589..62a0f51 100644
--- a/chrome/browser/resources/chromeos/switch_access/navigation_manager.js
+++ b/chrome/browser/resources/chromeos/switch_access/navigation_manager.js
@@ -32,6 +32,12 @@
     this.textInputManager_ = new TextInputManager(this);
 
     /**
+     * Handles text navigation actions.
+     * @private {!TextNavigationManager}
+     */
+    this.textNavigationManager_ = new TextNavigationManager();
+
+    /**
      * The desktop node.
      * @private {!chrome.automation.AutomationNode}
      */
@@ -232,6 +238,72 @@
   }
 
   /**
+   * Moves the text caret to the beginning of the current node.
+   * @public
+   */
+  jumpToBeginningOfText() {
+    this.textNavigationManager_.jumpToBeginning();
+  }
+
+  /**
+   * Moves the text caret to the end of the current node.
+   * @public
+   */
+  jumpToEndOfText() {
+    this.textNavigationManager_.jumpToEnd();
+  }
+
+  /**
+   * Moves the text caret backward one character in the current
+   * node.
+   * @public
+   */
+  moveBackwardOneCharOfText() {
+    this.textNavigationManager_.moveBackwardOneChar();
+  }
+
+  /**
+   * Moves the text caret backward one word in the current node.
+   * @public
+   */
+  moveBackwardOneWordOfText() {
+    this.textNavigationManager_.moveBackwardOneWord();
+  }
+
+  /**
+   * Moves the text caret down one line in the current node.
+   * @public
+   */
+  moveDownOneLineOfText() {
+    this.textNavigationManager_.moveDownOneLine();
+  }
+
+  /**
+   * Moves the text caret forward one character in the current
+   * node.
+   * @public
+   */
+  moveForwardOneCharOfText() {
+    this.textNavigationManager_.moveForwardOneChar();
+  }
+
+  /**
+   * Moves the text caret forward one word in the current node.
+   * @public
+   */
+  moveForwardOneWordOfText() {
+    this.textNavigationManager_.moveForwardOneWord();
+  }
+
+  /**
+   * Moves the text caret up one line in the current node.
+   * @public
+   */
+  moveUpOneLineOfText() {
+    this.textNavigationManager_.moveUpOneLine();
+  }
+
+  /**
    * Perform the default action for the currently highlighted node. If the node
    * is the current scope, go back to the previous scope. If the node is a group
    * other than the current scope, go into that scope. If the node is
@@ -247,6 +319,13 @@
     if (!this.node_.role)
       return;
 
+    if (window.switchAccess.textEditingEnabled()) {
+      if (SwitchAccessPredicate.isTextInput(this.node_)) {
+        this.node_.focus();
+        return;
+      }
+    }
+
     if (this.textInputManager_.pressKey(this.node_)) {
       return;
     }
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings.grd b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings.grd
index f80a3094..b69f750 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings.grd
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings.grd
@@ -162,6 +162,30 @@
       <message desc="The Switch Access action to open the Switch Access settings page. Should be short." name="IDS_SWITCH_ACCESS_SETTINGS_ACTION">
         Settings
       </message>
+      <message desc="The Switch Access action for moving the text caret to the beginning of the text element." name="IDS_SWITCH_ACCESS_JUMP_TO_BEGINNING_OF_TEXT">
+        Jump to beginning
+      </message>
+      <message desc="The Switch Access action for moving the text caret to the end of the text element." name="IDS_SWITCH_ACCESS_JUMP_TO_END_OF_TEXT">
+        Jump to end
+      </message>
+      <message desc="The Switch Access action for moving the text caret backward one character." name="IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_CHAR_OF_TEXT">
+        Move backward one char
+      </message>
+      <message desc="The Switch Access action for moving the text caret backward one word." name="IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_WORD_OF_TEXT">
+        Move backward one word
+      </message>
+      <message desc="The Switch Access action for moving the text caret forward one character." name="IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_CHAR_OF_TEXT">
+        Move forward one char
+      </message>
+      <message desc="The Switch Access action for moving the text caret forward one word." name="IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_WORD_OF_TEXT">
+        Move forward one word
+      </message>
+      <message desc="The Switch Access action for moving the text caret down one line." name="IDS_SWITCH_ACCESS_MOVE_DOWN_ONE_LINE_OF_TEXT">
+        Move down one line
+      </message>
+      <message desc="The Switch Access action for moving the text caret up one line." name="IDS_SWITCH_ACCESS_MOVE_UP_ONE_LINE_OF_TEXT">
+        Move up one line
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_BEGINNING_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_BEGINNING_OF_TEXT.png.sha1
new file mode 100644
index 0000000..3bbc42c
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_BEGINNING_OF_TEXT.png.sha1
@@ -0,0 +1 @@
+e68ee6951b36fbe8e64d71db1a0ba9e7a0bdb490
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_END_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_END_OF_TEXT.png.sha1
new file mode 100644
index 0000000..acfcd4df
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_END_OF_TEXT.png.sha1
@@ -0,0 +1 @@
+6824a4fdfc95468f05dde0020c28a853f5a67a70
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_CHAR_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_CHAR_OF_TEXT.png.sha1
new file mode 100644
index 0000000..0f2b1be
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_CHAR_OF_TEXT.png.sha1
@@ -0,0 +1 @@
+d1834f2f0ba5afcd82c98d5c56c7745977b5faeb
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_WORD_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_WORD_OF_TEXT.png.sha1
new file mode 100644
index 0000000..ffbb193b
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_WORD_OF_TEXT.png.sha1
@@ -0,0 +1 @@
+84dc7a4068ab23c21f69e1a7a4ee54b9712ada39
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_DOWN_ONE_LINE_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_DOWN_ONE_LINE_OF_TEXT.png.sha1
new file mode 100644
index 0000000..6404a3d
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_DOWN_ONE_LINE_OF_TEXT.png.sha1
@@ -0,0 +1 @@
+46aa39047b892eafb7a60f143a62673505d168a9
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_CHAR_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_CHAR_OF_TEXT.png.sha1
new file mode 100644
index 0000000..7a794ba
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_CHAR_OF_TEXT.png.sha1
@@ -0,0 +1 @@
+aafc234630449ed9a4cbac49938ea85147359c78
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_WORD_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_WORD_OF_TEXT.png.sha1
new file mode 100644
index 0000000..883c63b
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_WORD_OF_TEXT.png.sha1
@@ -0,0 +1 @@
+fb106304128d1e93cf5c593ac8920cc3386ff8ad
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_UP_ONE_LINE_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_UP_ONE_LINE_OF_TEXT.png.sha1
new file mode 100644
index 0000000..514b4a0
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_UP_ONE_LINE_OF_TEXT.png.sha1
@@ -0,0 +1 @@
+a97cb50b5142d21a91e19f098715aa3820b47a00
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/switch_access.js b/chrome/browser/resources/chromeos/switch_access/switch_access.js
index a6127d5e..6a0395e 100644
--- a/chrome/browser/resources/chromeos/switch_access/switch_access.js
+++ b/chrome/browser/resources/chromeos/switch_access/switch_access.js
@@ -54,6 +54,12 @@
      */
     this.navReadyCallback_ = null;
 
+    /**
+     * Feature flag controlling improvement of text input capabilities.
+     * @private {boolean}
+     */
+    this.enableTextEditing_ = false;
+
     this.init_();
   }
 
@@ -73,6 +79,11 @@
       if (this.navReadyCallback_)
         this.navReadyCallback_();
     }.bind(this));
+
+    chrome.commandLinePrivate.hasSwitch(
+        'enable-experimental-accessibility-switch-access-text', (result) => {
+          this.enableTextEditing_ = result;
+        });
   }
 
   /**
@@ -122,6 +133,16 @@
   }
 
   /**
+   * Returns whether or not the feature flag
+   * for text editing is enabled.
+   * @return {boolean}
+   * @public
+   */
+  textEditingEnabled() {
+    return this.enableTextEditing_;
+  }
+
+  /**
    * Return a list of the names of all user commands.
    * @override
    * @return {!Array<!SAConstants.Command>}
diff --git a/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js b/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js
index 1420d6d9..4c9fd05 100644
--- a/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js
+++ b/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js
@@ -136,8 +136,24 @@
   DICTATION: 'dictation',
   // Increment the value of an input field.
   INCREMENT: chrome.automation.ActionType.INCREMENT,
+  // Move text caret to the beginning of the text field.
+  JUMP_TO_BEGINNING_OF_TEXT: 'jumpToBeginningOfText',
+  // Move text caret to the end of the text field.
+  JUMP_TO_END_OF_TEXT: 'jumpToEndOfText',
   // Open and jump to the virtual keyboard
   KEYBOARD: 'keyboard',
+  // Move text caret one character backward.
+  MOVE_BACKWARD_ONE_CHAR_OF_TEXT: 'moveBackwardOneCharOfText',
+  // Move text caret one word backward.
+  MOVE_BACKWARD_ONE_WORD_OF_TEXT: 'moveBackwardOneWordOfText',
+  // Move text caret one line down.
+  MOVE_DOWN_ONE_LINE_OF_TEXT: 'moveDownOneLineOfText',
+  // Move text caret one character forward.
+  MOVE_FORWARD_ONE_CHAR_OF_TEXT: 'moveForwardOneCharOfText',
+  // Move text caret one word forward.
+  MOVE_FORWARD_ONE_WORD_OF_TEXT: 'moveForwardOneWordOfText',
+  // Move text caret one line up.
+  MOVE_UP_ONE_LINE_OF_TEXT: 'moveUpOneLineOfText',
   // Open and jump to the Switch Access settings in a new Chrome tab.
   OPTIONS: 'options',
   // Scroll the current element (or its ancestor) logically backwards.
@@ -170,3 +186,18 @@
   width: 0,
   height: 0
 };
+
+/**
+ * Defines the key codes of all key events to be sent.
+ * Currently used for text navigation actions.
+ * @enum {number}
+ * @const
+ */
+SAConstants.KeyCode = {
+  END: 35,
+  HOME: 36,
+  LEFT_ARROW: 37,
+  UP_ARROW: 38,
+  RIGHT_ARROW: 39,
+  DOWN_ARROW: 40
+};
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/text_navigation_manager.js b/chrome/browser/resources/chromeos/switch_access/text_navigation_manager.js
new file mode 100644
index 0000000..f8d47fd
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/text_navigation_manager.js
@@ -0,0 +1,112 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * Class to handle navigating text. Currently, only
+ * navigation of editable text fields is supported.
+ */
+class TextNavigationManager {
+  /**
+   * Jumps to the beginning of the text field (does nothing
+   * if already at the beginning).
+   * @public
+   */
+  jumpToBeginning() {
+    this.simulateKeyPress_(SAConstants.KeyCode.HOME, {ctrl: true});
+  }
+
+  /**
+   * Jumps to the end of the text field (does nothing if
+   * already at the end).
+   * @public
+   */
+  jumpToEnd() {
+    this.simulateKeyPress_(SAConstants.KeyCode.END, {ctrl: true});
+  }
+
+  /**
+   * Moves the text caret one character back (does nothing
+   * if there are no more characters preceding the current
+   * location of the caret).
+   * @public
+   */
+  moveBackwardOneChar() {
+    this.simulateKeyPress_(SAConstants.KeyCode.LEFT_ARROW, {});
+  }
+
+  /**
+   * Moves the text caret one word backwards (does nothing
+   * if already at the beginning of the field). If the
+   * text caret is in the middle of a word, moves the caret
+   * to the beginning of that word.
+   * @public
+   */
+  moveBackwardOneWord() {
+    this.simulateKeyPress_(SAConstants.KeyCode.LEFT_ARROW, {ctrl: true});
+  }
+
+  /**
+   * Moves the text caret one character forward (does nothing
+   * if there are no more characters following the current
+   * location of the caret).
+   * @public
+   */
+  moveForwardOneChar() {
+    this.simulateKeyPress_(SAConstants.KeyCode.RIGHT_ARROW, {});
+  }
+
+  /**
+   * Moves the text caret one word forward (does nothing if
+   * already at the end of the field). If the text caret is
+   * in the middle of a word, moves the caret to the end of
+   * that word.
+   * @public
+   */
+  moveForwardOneWord() {
+    this.simulateKeyPress_(SAConstants.KeyCode.RIGHT_ARROW, {ctrl: true});
+  }
+
+  /**
+   * Moves the text caret one line up (does nothing
+   * if there are no lines above the current location of
+   * the caret).
+   * @public
+   */
+  moveUpOneLine() {
+    this.simulateKeyPress_(SAConstants.KeyCode.UP_ARROW, {});
+  }
+
+  /**
+   * Moves the text caret one line down (does nothing
+   * if there are no lines below the current location of
+   * the caret).
+   * @public
+   */
+  moveDownOneLine() {
+    this.simulateKeyPress_(SAConstants.KeyCode.DOWN_ARROW, {});
+  }
+
+  /**
+   * Simulates a single key stroke with the given key code
+   * and keyboard modifiers (whether or not CTRL, ALT, SEARCH,
+   * SHIFT are being held).
+   *
+   * @param {number} keyCode
+   * @param {!chrome.accessibilityPrivate.SyntheticKeyboardModifiers} modifiers
+   * @private
+   */
+  simulateKeyPress_(keyCode, modifiers) {
+    chrome.accessibilityPrivate.sendSyntheticKeyEvent({
+      type: chrome.accessibilityPrivate.SyntheticKeyboardEventType.KEYDOWN,
+      keyCode: keyCode,
+      modifiers: modifiers
+    });
+
+    chrome.accessibilityPrivate.sendSyntheticKeyEvent({
+      type: chrome.accessibilityPrivate.SyntheticKeyboardEventType.KEYUP,
+      keyCode: keyCode,
+      modifiers: modifiers
+    });
+  }
+}
\ No newline at end of file
diff --git a/chrome/browser/resources/local_ntp/icons/colored_header.svg b/chrome/browser/resources/local_ntp/icons/colored_header.svg
new file mode 100644
index 0000000..288f6f4
--- /dev/null
+++ b/chrome/browser/resources/local_ntp/icons/colored_header.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="130px"
+   height="40px"
+   viewBox="0 0 130 40"
+   version="1.1"
+   id="svg4765"
+   sodipodi:docname="colored-header.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata4771">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>ic-ntp-shortcuts-header</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs4769" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1297"
+     inkscape:window-height="688"
+     id="namedview4767"
+     showgrid="false"
+     inkscape:zoom="4.8"
+     inkscape:cx="76.144652"
+     inkscape:cy="32.314819"
+     inkscape:window-x="3486"
+     inkscape:window-y="298"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg4765" />
+  <!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
+  <title
+     id="title4758">ic-ntp-shortcuts-header</title>
+  <desc
+     id="desc4760">Created with Sketch.</desc>
+  <path
+     style="fill:#d93025;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+     d="m 52.792125,16.638275 c -1.558053,-0.640709 -2.46799,-1.578762 -3.063032,-3.157678 -0.258437,-0.685749 -0.302859,-1.064041 -0.253341,-2.157386 0.07554,-1.6677974 0.544737,-2.7097496 1.692666,-3.7588922 1.12893,-1.0317787 2.113309,-1.3670063 3.799505,-1.2939114 1.164657,0.050487 1.439108,0.1180822 2.257734,0.5560648 1.700233,0.9096603 2.652276,2.4152882 2.778616,4.3942958 0.16603,2.600723 -1.339494,4.846853 -3.731181,5.566645 -1.067754,0.321347 -2.484458,0.260649 -3.480967,-0.149138 z m 3.677461,-2.238987 C 58.141804,13.055014 58.277858,10.477094 56.75087,9.0695662 55.705568,8.10604 54.548174,7.9476031 53.280665,8.5945264 c -0.664803,0.3393084 -0.94822,0.6565765 -1.321342,1.4791646 -0.598485,1.319424 -0.311237,3.055032 0.667322,4.032083 0.653851,0.652843 1.188222,0.836121 2.296145,0.787527 0.844457,-0.03704 1.066592,-0.107983 1.546796,-0.494013 z"
+     id="path4775"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:#d93025;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+     d="m 93.243638,16.791187 c -1.322385,-0.431646 -2.605435,-1.58809 -3.170464,-2.857618 -0.443424,-0.996302 -0.537766,-3.114174 -0.186146,-4.1787327 0.459731,-1.3918707 1.289274,-2.403738 2.498628,-3.0477998 0.656316,-0.3495315 0.897078,-0.3922845 2.209709,-0.3923856 1.750154,-1.347e-4 2.263078,0.211741 3.365322,1.3901286 0.739022,0.7900748 1.5471,2.3122585 1.328555,2.5026125 -0.06993,0.06091 -1.701563,0.761437 -3.625851,1.556728 -1.924288,0.795291 -3.498705,1.501853 -3.498705,1.570138 0,0.285461 1.0896,1.299941 1.564555,1.456691 0.644907,0.212838 1.770254,0.209983 2.343655,-0.0059 0.240652,-0.09062 0.683662,-0.403876 0.984466,-0.696115 l 0.546916,-0.531343 0.815738,0.541619 c 0.448656,0.29789 0.815737,0.60109 0.815737,0.673777 0,0.244635 -1.458021,1.445674 -2.168455,1.786257 -0.873904,0.41895 -2.878317,0.540562 -3.82366,0.231989 z m 1.314899,-6.424686 c 1.257312,-0.5311184 2.17288,-1.0008387 2.17288,-1.1147688 0,-0.3474108 -0.956531,-0.9438591 -1.67065,-1.04174 -0.932951,-0.1278751 -1.864461,0.242135 -2.510919,0.997376 -0.449206,0.5247962 -0.827104,1.4859958 -0.827104,2.1037728 0,0.266282 -0.145753,0.314835 2.835793,-0.94464 z"
+     id="path4777"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:#1e8e3e;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+     d="M 85.977501,8.5979031 V 0.64295185 h 1.104855 1.104854 V 8.5979031 16.552854 h -1.104854 -1.104855 z"
+     id="path4779"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:#1a73e8;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+     d="m 76.853462,21.598658 c -0.343214,-0.141956 -0.909847,-0.462726 -1.259185,-0.712823 -0.645316,-0.461992 -1.625016,-1.763251 -1.533724,-2.037126 0.02754,-0.08262 0.437826,-0.306096 0.911747,-0.49661 0.822217,-0.330527 0.868306,-0.334119 1.006551,-0.07845 0.07968,0.147368 0.394194,0.508587 0.698913,0.80271 0.996155,0.961517 2.691209,1.078986 3.833419,0.26566 0.566545,-0.403415 0.98745,-1.36764 1.104998,-2.531367 0.109543,-1.08448 -3.39e-4,-1.224342 -0.555555,-0.707086 -0.643892,0.599876 -1.324944,0.81664 -2.55194,0.812228 -1.054528,-0.0038 -1.276472,-0.05685 -2.109672,-0.504311 -3.862174,-2.074153 -3.866917,-7.5505053 -0.0084,-9.6505955 1.098347,-0.5977958 2.689293,-0.6943715 3.771247,-0.2289274 0.41605,0.1789801 0.870894,0.451871 1.010762,0.6064241 0.358633,0.3962852 0.503271,0.3500329 0.503271,-0.1609361 V 6.5355084 h 1.031197 1.031198 v 5.2960496 c 0,3.363351 -0.0605,5.580934 -0.165782,6.076699 -0.358712,1.689134 -1.289475,2.954312 -2.611208,3.549392 -0.95478,0.429866 -3.221381,0.507672 -4.107878,0.141009 z m 3.008287,-6.822942 c 1.131717,-0.427593 1.868493,-1.669606 1.873289,-3.157878 0.0028,-0.86476 -0.0659,-1.157805 -0.425589,-1.8156234 -0.676343,-1.2369441 -1.920296,-1.8165584 -3.204597,-1.4931677 -1.451145,0.3654025 -2.321474,1.597539 -2.321474,3.2865421 0,1.537167 0.698039,2.683174 1.936465,3.179195 0.475504,0.190451 1.638963,0.190957 2.141906,9.28e-4 z"
+     id="path5324"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:#1a73e8;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+     d="m 37.702732,16.572061 c -3.608224,-1.03865 -6.260841,-4.438713 -6.260841,-8.0249993 0,-2.2866039 0.798299,-4.1654259 2.489127,-5.8582377 3.117921,-3.12157795 7.698154,-3.49323118 11.097943,-0.9005189 l 0.704548,0.5372957 -0.760012,0.769572 -0.760013,0.769572 -0.462627,-0.352863 C 43.496412,3.317807 42.893279,2.9741312 42.410562,2.7481575 41.624111,2.3799977 41.37134,2.3372843 39.978457,2.3371791 c -1.500588,-1.131e-4 -1.59332,0.0191 -2.676931,0.5546499 -3.83901,1.8973419 -4.670343,7.0194203 -1.632356,10.057408 2.928466,2.928465 8.493062,1.988634 9.608529,-1.622829 0.16848,-0.545475 0.306327,-1.084227 0.306327,-1.197226 0,-0.16852 -0.50316,-0.2054536 -2.798964,-0.2054536 H 39.986098 V 8.818874 7.7140197 h 3.903818 3.903819 v 1.3185742 c 0,0.7252158 -0.07326,1.6698661 -0.162794,2.0992231 -0.548224,2.628905 -2.660726,4.780475 -5.382742,5.482292 -1.197723,0.308808 -3.397293,0.288461 -4.545467,-0.04205 z"
+     id="path5326"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:#f9ab00;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+     d="m 64.866306,16.647989 c -1.439659,-0.592221 -2.160555,-1.252384 -2.901767,-2.6573 -0.361404,-0.685017 -0.396953,-0.897517 -0.396953,-2.372851 0,-1.475786 0.03675,-1.6952858 0.41163,-2.4586817 0.535869,-1.0912251 1.754624,-2.2082083 2.866597,-2.6272209 0.69966,-0.2636455 1.07663,-0.309028 2.172388,-0.261528 1.164657,0.050487 1.439108,0.1180822 2.257735,0.5560648 1.687943,0.9030855 2.648433,2.4297048 2.782833,4.4230818 0.130768,1.939493 -0.710405,3.739671 -2.239559,4.79284 -1.466601,1.010086 -3.396096,1.246007 -4.952904,0.605595 z m 3.653558,-2.248701 c 1.16647,-0.93771 1.639777,-2.558997 1.164655,-3.989457 -0.890126,-2.6799185 -4.315102,-2.9848143 -5.575768,-0.4963623 -0.712317,1.4060553 -0.505574,3.0327553 0.523065,4.1155843 0.689046,0.725346 1.200834,0.914267 2.341252,0.864248 0.844457,-0.03704 1.066592,-0.107983 1.546796,-0.494013 z"
+     id="path5328"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:#dadce0;fill-opacity:0;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+     d="M 3.7588617,39.742214 C 2.7434871,39.468647 2.1711297,39.11218 1.3945889,38.269732 0.42844335,37.221588 0.13699821,36.450285 0.14665102,34.967094 c 0.006563,-1.008469 0.0770533,-1.395522 0.36218888,-1.988738 0.5191587,-1.080096 1.671775,-2.172239 2.697566,-2.556037 l 0.849882,-0.317981 61.1647091,0.03753 61.164713,0.03753 0.77843,0.410145 c 1.9957,1.051511 3.04206,3.123768 2.65669,5.261441 -0.29425,1.632204 -1.31274,2.917822 -2.90184,3.662936 l -0.82791,0.388197 -60.766989,0.02759 C 12.45324,39.953695 4.4533772,39.929334 3.7588617,39.742214 Z"
+     id="path5330"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:#dadce0;fill-opacity:1;stroke:none;stroke-width:0.59527564;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+     d="M 3.5863687,39.610766 C 3.201034,39.47132 2.5199554,39.050116 2.072861,38.674757 -0.6345187,36.401774 -0.1604641,32.205634 2.9805331,30.640409 L 4.0562879,30.104338 H 64.980795 c 45.632965,0 61.127055,0.06068 61.731505,0.241783 0.44385,0.13298 1.17305,0.555106 1.62044,0.938057 2.8374,2.428712 1.9498,7.048709 -1.59742,8.314586 -1.09987,0.392503 -122.0649315,0.404292 -123.1489513,0.012 z"
+     id="path5391"
+     inkscape:connector-curvature="0" />
+</svg>
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css
index 4e4a88ef..cdeab31 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.css
+++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -1158,6 +1158,15 @@
   width: 130px;
 }
 
+.mini-header-colorful {
+  background-image: url(icons/colored_header.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+  background-size: 100%;
+  height: 40px;
+  width: 130px;
+}
+
 .mini-shortcuts {
   -webkit-mask-image: url(icons/shortcut-circles.svg);
   -webkit-mask-repeat: no-repeat;
@@ -1178,7 +1187,8 @@
   padding-top: 32px;
 }
 
-#backgrounds-default:not(.selected) .mini-header {
+#backgrounds-default:not(.selected) .mini-header,
+#backgrounds-default:not(.selected) .mini-header-colorful {
   height: 48px;
   width: 156px;
 }
diff --git a/chrome/browser/resources/local_ntp/local_ntp.html b/chrome/browser/resources/local_ntp/local_ntp.html
index 3964a81..9f2e45da 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.html
+++ b/chrome/browser/resources/local_ntp/local_ntp.html
@@ -224,7 +224,7 @@
         <div id="backgrounds-default" class="bg-sel-tile-bg">
           <div id="backgrounds-default-icon" class="bg-sel-tile" tabindex="-1">
             <div class="mini-page">
-              <div class="mini-header"></div>
+              <div class="mini-header-colorful"></div>
               <div class="mini-shortcuts"></div>
             </div>
           </div>
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html
index f6f7a00..c79e375 100644
--- a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html
+++ b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html
@@ -23,7 +23,7 @@
       }
     </style>
     <div class="settings-box first">
-      <div class="start">$i18n{fontSize}</div>
+      <div class="start settings-box-text">$i18n{fontSize}</div>
       <settings-slider id="sizeSlider"
           pref="{{prefs.webkit.webprefs.default_font_size}}"
           ticks="[[fontSizeRange_]]"
@@ -31,7 +31,7 @@
       </settings-slider>
     </div>
     <div class="settings-box">
-      <div class="start">$i18n{minimumFont}</div>
+      <div class="start settings-box-text">$i18n{minimumFont}</div>
       <div id="minimumSize">
         <settings-slider  pref="{{prefs.webkit.webprefs.minimum_font_size}}"
             ticks="[[minimumFontSizeRange_]]" label-min="$i18n{tiny}"
@@ -59,7 +59,7 @@
             menu-options="[[fontOptions_]]">
         </settings-dropdown-menu>
       </div>
-      <div class="list-item"
+      <div class="list-item settings-box-text"
           style="
               font-size:[[prefs.webkit.webprefs.default_font_size.value]]px;
               font-family:
@@ -80,7 +80,7 @@
             menu-options="[[fontOptions_]]">
         </settings-dropdown-menu>
       </div>
-      <div class="list-item"
+      <div class="list-item settings-box-text"
           style="
               font-size:[[prefs.webkit.webprefs.default_font_size.value]]px;
               font-family:
@@ -101,7 +101,7 @@
             menu-options="[[fontOptions_]]">
         </settings-dropdown-menu>
       </div>
-      <div class="list-item"
+      <div class="list-item settings-box-text"
           style="
               font-size:[[prefs.webkit.webprefs.default_font_size.value]]px;
               font-family:
@@ -122,7 +122,7 @@
             menu-options="[[fontOptions_]]">
         </settings-dropdown-menu>
       </div>
-      <div class="list-item"
+      <div class="list-item settings-box-text"
           style="
               font-size:
                   [[prefs.webkit.webprefs.default_fixed_font_size.value]]px;
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
index dbf3fc4..9440932 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
@@ -46,6 +46,9 @@
         z-index: 2;
         --cr-toolbar-left-spacer-width: var(--settings-menu-width);
         --cr-toolbar-center-basis: var(--settings-main-basis);
+        --cr-toolbar-search-field-background: var(--google-grey-refresh-100);
+        --cr-toolbar-search-field-border-radius: 4px;
+        --cr-toolbar-search-field-input-color: var(--google-grey-refresh-700);
       }
 
       #cr-container-shadow-top {
diff --git a/chrome/browser/safe_browsing/download_protection/file_analyzer.cc b/chrome/browser/safe_browsing/download_protection/file_analyzer.cc
index bd7b9db7..675b6c8 100644
--- a/chrome/browser/safe_browsing/download_protection/file_analyzer.cc
+++ b/chrome/browser/safe_browsing/download_protection/file_analyzer.cc
@@ -69,7 +69,7 @@
 
 }  // namespace
 
-FileAnalyzer::Results::Results() : file_count(0), directory_count(0) {}
+FileAnalyzer::Results::Results() = default;
 FileAnalyzer::Results::~Results() {}
 FileAnalyzer::Results::Results(const FileAnalyzer::Results& other) = default;
 
diff --git a/chrome/browser/safe_browsing/download_protection/file_analyzer.h b/chrome/browser/safe_browsing/download_protection/file_analyzer.h
index 02ca9ba4..c66100b4 100644
--- a/chrome/browser/safe_browsing/download_protection/file_analyzer.h
+++ b/chrome/browser/safe_browsing/download_protection/file_analyzer.h
@@ -46,11 +46,11 @@
 
     // For archive files, whether the archive contains an executable. Has
     // unspecified contents for non-archive files.
-    bool archived_executable;
+    bool archived_executable = false;
 
     // For archive files, whether the archive contains an archive. Has
     // unspecified contents for non-archive files.
-    bool archived_archive;
+    bool archived_archive = false;
 
     // For archive files, the features extracted from each contained
     // archive/binary.
@@ -74,10 +74,10 @@
 #endif
 
     // For archive files, the number of contained files.
-    int file_count;
+    int file_count = 0;
 
     // For archive files, the number of contained directories.
-    int directory_count;
+    int directory_count = 0;
   };
 
   explicit FileAnalyzer(
diff --git a/chrome/browser/search/chrome_colors/chrome_colors_service.cc b/chrome/browser/search/chrome_colors/chrome_colors_service.cc
index f5ad71bc..c8890042 100644
--- a/chrome/browser/search/chrome_colors/chrome_colors_service.cc
+++ b/chrome/browser/search/chrome_colors/chrome_colors_service.cc
@@ -13,27 +13,40 @@
 
 ChromeColorsService::~ChromeColorsService() = default;
 
-void ChromeColorsService::ApplyDefaultTheme() {
-  if (revert_theme_changes_.is_null())
-    revert_theme_changes_ = theme_service_->GetRevertThemeCallback();
+void ChromeColorsService::ApplyDefaultTheme(content::WebContents* tab) {
+  SaveThemeRevertState(tab);
   theme_service_->UseDefaultTheme();
 }
 
-void ChromeColorsService::ApplyAutogeneratedTheme(SkColor color) {
-  if (revert_theme_changes_.is_null())
-    revert_theme_changes_ = theme_service_->GetRevertThemeCallback();
+void ChromeColorsService::ApplyAutogeneratedTheme(SkColor color,
+                                                  content::WebContents* tab) {
+  SaveThemeRevertState(tab);
   theme_service_->BuildFromColor(color);
 }
 
+void ChromeColorsService::RevertThemeChangesForTab(content::WebContents* tab) {
+  if (dialog_tab_ == tab)
+    RevertThemeChanges();
+}
+
 void ChromeColorsService::RevertThemeChanges() {
   if (!revert_theme_changes_.is_null()) {
     std::move(revert_theme_changes_).Run();
-    revert_theme_changes_.Reset();
+    ConfirmThemeChanges();
   }
 }
 
 void ChromeColorsService::ConfirmThemeChanges() {
   revert_theme_changes_.Reset();
+  dialog_tab_ = nullptr;
+}
+
+void ChromeColorsService::SaveThemeRevertState(content::WebContents* tab) {
+  // TODO(crbug.com/980745): Support theme reverting for multiple tabs.
+  if (revert_theme_changes_.is_null()) {
+    revert_theme_changes_ = theme_service_->GetRevertThemeCallback();
+    dialog_tab_ = tab;
+  }
 }
 
 void ChromeColorsService::Shutdown() {}
diff --git a/chrome/browser/search/chrome_colors/chrome_colors_service.h b/chrome/browser/search/chrome_colors/chrome_colors_service.h
index 8fb73d9..55c71a4 100644
--- a/chrome/browser/search/chrome_colors/chrome_colors_service.h
+++ b/chrome/browser/search/chrome_colors/chrome_colors_service.h
@@ -8,6 +8,7 @@
 #include "base/callback.h"
 #include "chrome/browser/themes/theme_service.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "content/public/browser/web_contents.h"
 #include "third_party/skia/include/core/SkColor.h"
 
 class TestChromeColorsService;
@@ -23,14 +24,18 @@
   explicit ChromeColorsService(Profile* profile);
   ~ChromeColorsService() override;
 
-  // Applies a theme that can be reverted. Saves the previous theme state if
-  // needed.
-  void ApplyDefaultTheme();
-  void ApplyAutogeneratedTheme(SkColor color);
+  // Applies a theme that can be reverted by saving the previous theme state and
+  // the |tab| that changes are made from.
+  void ApplyDefaultTheme(content::WebContents* tab);
+  void ApplyAutogeneratedTheme(SkColor color, content::WebContents* tab);
 
-  // Reverts to the previous theme state before Apply* was used.
+  // Reverts to the previous theme state before first Apply* was used.
   void RevertThemeChanges();
 
+  // Same as |RevertThemeChanges| but only reverts theme changes if they were
+  // made from the same tab. Used for reverting changes from a closing NTP.
+  void RevertThemeChangesForTab(content::WebContents* tab);
+
   // Confirms current theme changes. Since the theme is already installed by
   // Apply*, this only clears the previously saved state.
   void ConfirmThemeChanges();
@@ -38,14 +43,23 @@
  private:
   friend class ::TestChromeColorsService;
 
+  // Saves the necessary state(revert callback and the current tab) for
+  // performing theme change revert. Saves the state only if it is not set.
+  void SaveThemeRevertState(content::WebContents* tab);
+
   // KeyedService implementation:
   void Shutdown() override;
 
   ThemeService* const theme_service_;
 
+  // The first tab that used Apply* and hasn't Confirm/Revert the changes.
+  content::WebContents* dialog_tab_ = nullptr;
+
   // Callback that will revert the theme to the state it was at the time of this
   // callback's creation.
   base::OnceClosure revert_theme_changes_;
+
+  DISALLOW_COPY_AND_ASSIGN(ChromeColorsService);
 };
 
 }  // namespace chrome_colors
diff --git a/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc b/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc
index 5043a01..78a89008 100644
--- a/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc
+++ b/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc
@@ -7,6 +7,7 @@
 #include "chrome/browser/themes/theme_service.h"
 #include "chrome/browser/themes/theme_service_factory.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
+#include "content/public/test/web_contents_tester.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 class TestChromeColorsService : public BrowserWithTestWindowTest {
@@ -17,6 +18,9 @@
     BrowserWithTestWindowTest::SetUp();
     chrome_colors_service_ =
         chrome_colors::ChromeColorsFactory::GetForProfile(profile());
+
+    AddTab(browser(), GURL("chrome://newtab"));
+    tab_ = browser()->tab_strip_model()->GetActiveWebContents();
   }
 
   bool HasThemeRevertCallback() {
@@ -24,6 +28,7 @@
   }
 
   chrome_colors::ChromeColorsService* chrome_colors_service_;
+  content::WebContents* tab_;
 };
 
 TEST_F(TestChromeColorsService, ApplyAndConfirmAutogeneratedTheme) {
@@ -31,12 +36,12 @@
   ASSERT_TRUE(theme_service->UsingDefaultTheme());
 
   SkColor theme_color1 = SkColorSetRGB(100, 0, 200);
-  chrome_colors_service_->ApplyAutogeneratedTheme(theme_color1);
+  chrome_colors_service_->ApplyAutogeneratedTheme(theme_color1, tab_);
   EXPECT_TRUE(theme_service->UsingAutogenerated());
   EXPECT_TRUE(HasThemeRevertCallback());
 
   SkColor theme_color2 = SkColorSetRGB(100, 0, 200);
-  chrome_colors_service_->ApplyAutogeneratedTheme(theme_color2);
+  chrome_colors_service_->ApplyAutogeneratedTheme(theme_color2, tab_);
   EXPECT_TRUE(theme_service->UsingAutogenerated());
   EXPECT_TRUE(HasThemeRevertCallback());
 
@@ -52,12 +57,12 @@
   ASSERT_TRUE(theme_service->UsingDefaultTheme());
 
   SkColor theme_color1 = SkColorSetRGB(100, 0, 200);
-  chrome_colors_service_->ApplyAutogeneratedTheme(theme_color1);
+  chrome_colors_service_->ApplyAutogeneratedTheme(theme_color1, tab_);
   EXPECT_TRUE(theme_service->UsingAutogenerated());
   EXPECT_TRUE(HasThemeRevertCallback());
 
   SkColor theme_color2 = SkColorSetRGB(100, 0, 200);
-  chrome_colors_service_->ApplyAutogeneratedTheme(theme_color2);
+  chrome_colors_service_->ApplyAutogeneratedTheme(theme_color2, tab_);
   EXPECT_TRUE(theme_service->UsingAutogenerated());
   EXPECT_TRUE(HasThemeRevertCallback());
 
@@ -75,7 +80,7 @@
   ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor());
 
   SkColor new_theme_color = SkColorSetRGB(100, 0, 200);
-  chrome_colors_service_->ApplyAutogeneratedTheme(new_theme_color);
+  chrome_colors_service_->ApplyAutogeneratedTheme(new_theme_color, tab_);
   EXPECT_EQ(new_theme_color, theme_service->GetThemeColor());
   EXPECT_TRUE(HasThemeRevertCallback());
 
@@ -93,7 +98,7 @@
   ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor());
 
   SkColor new_theme_color = SkColorSetRGB(100, 0, 200);
-  chrome_colors_service_->ApplyAutogeneratedTheme(new_theme_color);
+  chrome_colors_service_->ApplyAutogeneratedTheme(new_theme_color, tab_);
   EXPECT_EQ(new_theme_color, theme_service->GetThemeColor());
   EXPECT_TRUE(HasThemeRevertCallback());
 
@@ -110,7 +115,7 @@
   ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor());
   ASSERT_FALSE(theme_service->UsingDefaultTheme());
 
-  chrome_colors_service_->ApplyDefaultTheme();
+  chrome_colors_service_->ApplyDefaultTheme(tab_);
   EXPECT_TRUE(theme_service->UsingDefaultTheme());
   EXPECT_TRUE(HasThemeRevertCallback());
 
@@ -127,7 +132,7 @@
   ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor());
   ASSERT_FALSE(theme_service->UsingDefaultTheme());
 
-  chrome_colors_service_->ApplyDefaultTheme();
+  chrome_colors_service_->ApplyDefaultTheme(tab_);
   EXPECT_TRUE(theme_service->UsingDefaultTheme());
   EXPECT_TRUE(HasThemeRevertCallback());
 
@@ -136,3 +141,29 @@
   EXPECT_EQ(prev_theme_color, theme_service->GetThemeColor());
   EXPECT_FALSE(HasThemeRevertCallback());
 }
+
+TEST_F(TestChromeColorsService, RevertThemeChangesForTab) {
+  ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile());
+  ASSERT_TRUE(theme_service->UsingDefaultTheme());
+
+  SkColor theme_color = SkColorSetRGB(100, 0, 200);
+  chrome_colors_service_->ApplyAutogeneratedTheme(theme_color, tab_);
+  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(HasThemeRevertCallback());
+
+  chrome_colors_service_->RevertThemeChangesForTab(nullptr);
+  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(HasThemeRevertCallback());
+
+  AddTab(browser(), GURL("chrome://newtab"));
+  content::WebContents* second_tab =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_NE(tab_, second_tab);
+  chrome_colors_service_->RevertThemeChangesForTab(second_tab);
+  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(HasThemeRevertCallback());
+
+  chrome_colors_service_->RevertThemeChangesForTab(tab_);
+  EXPECT_FALSE(theme_service->UsingAutogenerated());
+  EXPECT_FALSE(HasThemeRevertCallback());
+}
diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc
index 04dbee0..a53102f5 100644
--- a/chrome/browser/sessions/session_restore.cc
+++ b/chrome/browser/sessions/session_restore.cc
@@ -17,6 +17,7 @@
 #include "base/callback.h"
 #include "base/command_line.h"
 #include "base/debug/alias.h"
+#include "base/feature_list.h"
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/metrics/field_trial.h"
@@ -46,6 +47,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/startup/startup_browser_creator.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/ui_features.h"
 #include "chrome/common/extensions/extension_metrics.h"
 #include "chrome/common/url_constants.h"
 #include "components/keep_alive_registry/keep_alive_types.h"
@@ -578,16 +580,20 @@
               ->RecreateSessionStorage(tab.session_storage_persistent_id);
     }
 
+    // Apply the stored group if tab groups are enabled.
+    base::Optional<base::Token> group;
+    if (base::FeatureList::IsEnabled(features::kTabGroups))
+      group = tab.group;
+
     WebContents* web_contents = chrome::AddRestoredTab(
         browser, tab.navigations, tab_index, selected_index,
-        tab.extension_app_id, tab.group, is_selected_tab, tab.pinned, true,
+        tab.extension_app_id, group, is_selected_tab, tab.pinned, true,
         last_active_time, session_storage_namespace.get(),
         tab.user_agent_override, true /* from_session_restore */);
     DCHECK(web_contents);
 
     RestoredTab restored_tab(web_contents, is_selected_tab,
-                             tab.extension_app_id.empty(), tab.pinned,
-                             tab.group);
+                             tab.extension_app_id.empty(), tab.pinned, group);
     created_contents->push_back(restored_tab);
 
     // If this isn't the selected tab, there's nothing else to do.
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc
index 3d9bcef0..e936f2a 100644
--- a/chrome/browser/sessions/session_restore_browsertest.cc
+++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -17,6 +17,7 @@
 #include "base/process/launch.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -42,6 +43,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/tabs/tab_group_id.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/ui_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -947,6 +949,9 @@
 }  // namespace
 
 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, TabsWithGroups) {
+  base::test::ScopedFeatureList feature_override;
+  feature_override.InitAndEnableFeature(features::kTabGroups);
+
   constexpr int kNumTabs = 6;
   const std::array<base::Optional<int>, kNumTabs> group_spec = {
       0, 0, base::nullopt, base::nullopt, 1, 1};
@@ -973,6 +978,9 @@
 // Test that tab groups are restored correctly after the command set is rebuilt
 // from the browser state.
 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, TabsWithGroupsCommandReset) {
+  base::test::ScopedFeatureList feature_override;
+  feature_override.InitAndEnableFeature(features::kTabGroups);
+
   constexpr int kNumTabs = 6;
   const std::array<base::Optional<int>, kNumTabs> group_spec = {
       0, 0, base::nullopt, base::nullopt, 1, 1};
@@ -1002,6 +1010,23 @@
   EXPECT_EQ(groups, GetTabGroups(new_browser->tab_strip_model()));
 }
 
+// Ensure tab groups aren't restored if |features::kTabGroups| is disabled.
+// Regression test for crbug.com/983962.
+IN_PROC_BROWSER_TEST_F(SessionRestoreTest,
+                       GroupsNotRestoredWhenFeatureDisabled) {
+  auto feature_override = std::make_unique<base::test::ScopedFeatureList>();
+  feature_override->InitAndEnableFeature(features::kTabGroups);
+
+  ASSERT_EQ(1, browser()->tab_strip_model()->count());
+  browser()->tab_strip_model()->AddToNewGroup({0});
+
+  feature_override = std::make_unique<base::test::ScopedFeatureList>();
+  feature_override->InitAndDisableFeature(features::kTabGroups);
+  Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
+  ASSERT_EQ(base::nullopt,
+            new_browser->tab_strip_model()->GetTabGroupForTab(0));
+}
+
 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreAfterDelete) {
   ui_test_utils::NavigateToURL(browser(), url1_);
   ui_test_utils::NavigateToURL(browser(), url2_);
diff --git a/chrome/browser/sessions/tab_restore_browsertest.cc b/chrome/browser/sessions/tab_restore_browsertest.cc
index fced7a7..edbf923 100644
--- a/chrome/browser/sessions/tab_restore_browsertest.cc
+++ b/chrome/browser/sessions/tab_restore_browsertest.cc
@@ -10,6 +10,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/test_timeouts.h"
 #include "build/build_config.h"
 #include "chrome/app/chrome_command_ids.h"
@@ -27,6 +28,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/find_bar/find_notification_details.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/ui_features.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -884,6 +886,9 @@
 }
 
 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreGroupedTab) {
+  base::test::ScopedFeatureList feature_override;
+  feature_override.InitAndEnableFeature(features::kTabGroups);
+
   const int tab_count = AddSomeTabs(browser(), 1);
   ASSERT_LE(2, tab_count);
 
@@ -904,6 +909,9 @@
 }
 
 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreWindowWithGroupedTabs) {
+  base::test::ScopedFeatureList feature_override;
+  feature_override.InitAndEnableFeature(features::kTabGroups);
+
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), GURL(chrome::kChromeUINewTabURL),
       WindowOpenDisposition::NEW_WINDOW,
@@ -933,3 +941,30 @@
       base::make_optional(group2),
       restored_window->tab_strip_model()->GetTabGroupForTab(tab_count - 1));
 }
+
+// Ensure tab groups aren't restored if |features::kTabGroups| is disabled.
+// Regression test for crbug.com/983962.
+IN_PROC_BROWSER_TEST_F(TabRestoreTest, GroupsNotRestoredWhenFeatureDisabled) {
+  auto feature_override = std::make_unique<base::test::ScopedFeatureList>();
+  feature_override->InitAndEnableFeature(features::kTabGroups);
+
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_WINDOW,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
+  ASSERT_EQ(2u, active_browser_list_->size());
+
+  browser()->tab_strip_model()->AddToNewGroup({0});
+  CloseBrowserSynchronously(browser());
+  ASSERT_EQ(1u, active_browser_list_->size());
+
+  feature_override = std::make_unique<base::test::ScopedFeatureList>();
+  feature_override->InitAndDisableFeature(features::kTabGroups);
+
+  chrome::RestoreTab(GetBrowser(0));
+  ASSERT_EQ(2u, active_browser_list_->size());
+
+  Browser* restored_window = GetBrowser(1);
+  ASSERT_EQ(base::nullopt,
+            restored_window->tab_strip_model()->GetTabGroupForTab(0));
+}
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_constants.h b/chrome/browser/sharing/click_to_call/click_to_call_constants.h
index e1304af0..88200c00 100644
--- a/chrome/browser/sharing/click_to_call/click_to_call_constants.h
+++ b/chrome/browser/sharing/click_to_call/click_to_call_constants.h
@@ -12,4 +12,14 @@
 constexpr base::TimeDelta kSharingClickToCallMessageTTL =
     base::TimeDelta::FromMinutes(10);
 
+// Maximum number of devices to be shown in dialog and context menu.
+constexpr int kMaxDevicesShown = 10;
+
+// Command id for first device shown in submenu.
+constexpr int kSubMenuFirstDeviceCommandId = 2150;
+
+// Command id for last device shown in submenu.
+constexpr int kSubMenuLastDeviceCommandId =
+    kSubMenuFirstDeviceCommandId + kMaxDevicesShown - 1;
+
 #endif  // CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_CONSTANTS_H_
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.cc b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.cc
new file mode 100644
index 0000000..67c4499
--- /dev/null
+++ b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.cc
@@ -0,0 +1,164 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h"
+
+#include "base/bind.h"
+#include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
+#include "chrome/app/chrome_command_ids.h"
+#include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
+#include "chrome/browser/sharing/click_to_call/click_to_call_constants.h"
+#include "chrome/browser/sharing/click_to_call/feature.h"
+#include "chrome/browser/sharing/sharing_service.h"
+#include "chrome/browser/sharing/sharing_service_factory.h"
+#include "chrome/grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/color_palette.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/native_theme/native_theme.h"
+#include "ui/views/controls/menu/menu_config.h"
+#include "url/url_constants.h"
+
+using SharingMessage = chrome_browser_sharing::SharingMessage;
+
+ClickToCallContextMenuObserver::SubMenuDelegate::SubMenuDelegate(
+    ClickToCallContextMenuObserver* parent)
+    : parent_(parent) {}
+
+ClickToCallContextMenuObserver::SubMenuDelegate::~SubMenuDelegate() = default;
+
+bool ClickToCallContextMenuObserver::SubMenuDelegate::IsCommandIdEnabled(
+    int command_id) const {
+  // All supported commands are enabled in sub menu.
+  return true;
+}
+
+void ClickToCallContextMenuObserver::SubMenuDelegate::ExecuteCommand(
+    int command_id,
+    int event_flags) {
+  if (command_id < kSubMenuFirstDeviceCommandId ||
+      command_id > kSubMenuLastDeviceCommandId)
+    return;
+  int device_index = command_id - kSubMenuFirstDeviceCommandId;
+  parent_->SendClickToCallMessage(device_index);
+}
+
+ClickToCallContextMenuObserver::ClickToCallContextMenuObserver(
+    RenderViewContextMenuProxy* proxy)
+    : proxy_(proxy),
+      sharing_service_(SharingServiceFactory::GetForBrowserContext(
+          proxy_->GetBrowserContext())) {}
+
+ClickToCallContextMenuObserver::~ClickToCallContextMenuObserver() = default;
+
+void ClickToCallContextMenuObserver::InitMenu(
+    const content::ContextMenuParams& params) {
+  url_ = params.link_url;
+  devices_ = sharing_service_->GetDeviceCandidates(
+      static_cast<int>(SharingDeviceCapability::kTelephony));
+  if (devices_.empty())
+    return;
+
+  proxy_->AddSeparator();
+  if (devices_.size() == 1) {
+#if defined(OS_MACOSX)
+    proxy_->AddMenuItem(
+        IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE,
+        l10n_util::GetStringFUTF16(
+            IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE,
+            base::UTF8ToUTF16(devices_[0].human_readable_name())));
+#else
+    proxy_->AddMenuItemWithIcon(
+        IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE,
+        l10n_util::GetStringFUTF16(
+            IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE,
+            base::UTF8ToUTF16(devices_[0].human_readable_name())),
+        GetContextMenuIcon());
+#endif
+  } else {
+    BuildSubMenu();
+#if defined(OS_MACOSX)
+    proxy_->AddSubMenu(
+        IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES,
+        l10n_util::GetStringUTF16(
+            IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES),
+        sub_menu_model_.get());
+#else
+    proxy_->AddSubMenuWithStringIdAndIcon(
+        IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES,
+        IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES,
+        sub_menu_model_.get(), GetContextMenuIcon());
+#endif
+  }
+}
+
+void ClickToCallContextMenuObserver::BuildSubMenu() {
+  sub_menu_model_ = std::make_unique<ui::SimpleMenuModel>(&sub_menu_delegate_);
+
+  int command_id = kSubMenuFirstDeviceCommandId;
+  for (const auto& device : devices_) {
+    if (command_id > kSubMenuLastDeviceCommandId)
+      break;
+    sub_menu_model_->AddItem(command_id++,
+                             base::UTF8ToUTF16(device.human_readable_name()));
+  }
+}
+
+bool ClickToCallContextMenuObserver::IsCommandIdSupported(int command_id) {
+  if (devices_.empty())
+    return false;
+
+  if (devices_.size() == 1) {
+    return command_id ==
+           IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE;
+  } else {
+    return command_id ==
+           IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES;
+  }
+}
+
+bool ClickToCallContextMenuObserver::IsCommandIdEnabled(int command_id) {
+  // All supported commands are enabled.
+  return true;
+}
+
+void ClickToCallContextMenuObserver::ExecuteCommand(int command_id) {
+  if (command_id == IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE) {
+    DCHECK(devices_.size() == 1);
+    SendClickToCallMessage(0);
+  }
+}
+
+void ClickToCallContextMenuObserver::SendClickToCallMessage(
+    int chosen_device_index) {
+  if (chosen_device_index >= static_cast<int>(devices_.size()))
+    return;
+
+  SharingMessage sharing_message;
+  sharing_message.mutable_click_to_call_message()->set_phone_number(
+      url_.GetContent());
+
+  sharing_service_->SendMessageToDevice(
+      devices_[chosen_device_index].guid(), kSharingClickToCallMessageTTL,
+      sharing_message,
+      base::BindOnce(&ClickToCallContextMenuObserver::OnMessageSent,
+                     AsWeakPtr()));
+}
+
+void ClickToCallContextMenuObserver::OnMessageSent(
+    base::Optional<std::string> message_id) const {
+  // TODO(himanshujaju) Add metrics.
+}
+
+gfx::ImageSkia ClickToCallContextMenuObserver::GetContextMenuIcon() const {
+  bool dark_mode_enabled =
+      ui::NativeTheme::GetInstanceForNativeUi()->SystemDarkModeEnabled();
+  const gfx::VectorIcon* vector_icon = &kHardwareSmartphoneIcon;
+  const views::MenuConfig& menu_config = views::MenuConfig::instance();
+  return gfx::CreateVectorIcon(
+      *vector_icon, menu_config.touchable_icon_size,
+      dark_mode_enabled ? gfx::kGoogleGrey500 : gfx::kChromeIconGrey);
+}
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h
new file mode 100644
index 0000000..44d622a6
--- /dev/null
+++ b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h
@@ -0,0 +1,87 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_CONTEXT_MENU_OBSERVER_H_
+#define CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_CONTEXT_MENU_OBSERVER_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "chrome/browser/sharing/sharing_device_info.h"
+#include "components/renderer_context_menu/render_view_context_menu_observer.h"
+#include "ui/base/models/simple_menu_model.h"
+#include "url/gurl.h"
+
+namespace gfx {
+class ImageSkia;
+}
+
+class RenderViewContextMenuProxy;
+
+class SharingService;
+
+class ClickToCallContextMenuObserver
+    : public RenderViewContextMenuObserver,
+      public base::SupportsWeakPtr<ClickToCallContextMenuObserver> {
+ public:
+  class SubMenuDelegate : public ui::SimpleMenuModel::Delegate {
+   public:
+    explicit SubMenuDelegate(ClickToCallContextMenuObserver* parent);
+    ~SubMenuDelegate() override;
+
+    bool IsCommandIdEnabled(int command_id) const override;
+    void ExecuteCommand(int command_id, int event_flags) override;
+
+   private:
+    ClickToCallContextMenuObserver* const parent_;
+
+    DISALLOW_COPY_AND_ASSIGN(SubMenuDelegate);
+  };
+
+  explicit ClickToCallContextMenuObserver(RenderViewContextMenuProxy* proxy);
+  ~ClickToCallContextMenuObserver() override;
+
+  // RenderViewContextMenuObserver implementation.
+  void InitMenu(const content::ContextMenuParams& params) override;
+  bool IsCommandIdSupported(int command_id) override;
+  bool IsCommandIdEnabled(int command_id) override;
+  void ExecuteCommand(int command_id) override;
+
+ private:
+  FRIEND_TEST_ALL_PREFIXES(ClickToCallContextMenuObserverTest,
+                           SingleDevice_ShowMenu);
+  FRIEND_TEST_ALL_PREFIXES(ClickToCallContextMenuObserverTest,
+                           MultipleDevices_ShowMenu);
+  FRIEND_TEST_ALL_PREFIXES(ClickToCallContextMenuObserverTest,
+                           MultipleDevices_MoreThanMax_ShowMenu);
+
+  void BuildSubMenu();
+
+  void SendClickToCallMessage(int chosen_device_index);
+
+  void OnMessageSent(base::Optional<std::string> message_id) const;
+
+  gfx::ImageSkia GetContextMenuIcon() const;
+
+  RenderViewContextMenuProxy* proxy_ = nullptr;
+
+  SharingService* sharing_service_ = nullptr;
+
+  SubMenuDelegate sub_menu_delegate_{this};
+
+  GURL url_;
+
+  std::vector<SharingDeviceInfo> devices_;
+
+  std::unique_ptr<ui::SimpleMenuModel> sub_menu_model_;
+
+  DISALLOW_COPY_AND_ASSIGN(ClickToCallContextMenuObserver);
+};
+
+#endif  // CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_CONTEXT_MENU_OBSERVER_H_
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc
new file mode 100644
index 0000000..b1ef91a7
--- /dev/null
+++ b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc
@@ -0,0 +1,263 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h"
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/strings/strcat.h"
+#include "base/strings/string_number_conversions.h"
+#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/renderer_context_menu/mock_render_view_context_menu.h"
+#include "chrome/browser/sharing/click_to_call/click_to_call_constants.h"
+#include "chrome/browser/sharing/click_to_call/feature.h"
+#include "chrome/browser/sharing/sharing_device_info.h"
+#include "chrome/browser/sharing/sharing_fcm_handler.h"
+#include "chrome/browser/sharing/sharing_fcm_sender.h"
+#include "chrome/browser/sharing/sharing_service.h"
+#include "chrome/browser/sharing/sharing_service_factory.h"
+#include "chrome/browser/sharing/sharing_sync_preference.h"
+#include "chrome/browser/sharing/vapid_key_manager.h"
+#include "content/public/common/context_menu_params.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+using ::testing::_;
+using ::testing::ByMove;
+using ::testing::Eq;
+using ::testing::NiceMock;
+using ::testing::Return;
+
+using SharingMessage = chrome_browser_sharing::SharingMessage;
+
+namespace {
+
+const char kTelUrl[] = "tel:+9876543210";
+
+constexpr int kSeparatorCommandId = -1;
+
+class MockSharingService : public SharingService {
+ public:
+  explicit MockSharingService(std::unique_ptr<SharingFCMHandler> fcm_handler)
+      : SharingService(nullptr,
+                       nullptr,
+                       nullptr,
+                       nullptr,
+                       std::move(fcm_handler),
+                       nullptr,
+                       nullptr,
+                       nullptr) {}
+
+  ~MockSharingService() override = default;
+
+  MOCK_CONST_METHOD1(GetDeviceCandidates,
+                     std::vector<SharingDeviceInfo>(int required_capabilities));
+
+  MOCK_METHOD4(SendMessageToDevice,
+               void(const std::string& device_guid,
+                    base::TimeDelta time_to_live,
+                    SharingMessage message,
+                    SharingService::SendMessageCallback callback));
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockSharingService);
+};
+
+class ClickToCallContextMenuObserverTest : public testing::Test {
+ public:
+  ClickToCallContextMenuObserverTest() = default;
+
+  ~ClickToCallContextMenuObserverTest() override = default;
+
+  void SetUp() override {
+    SharingServiceFactory::GetInstance()->SetTestingFactory(
+        menu_.GetBrowserContext(),
+        base::BindRepeating([](content::BrowserContext* context)
+                                -> std::unique_ptr<KeyedService> {
+          return std::make_unique<NiceMock<MockSharingService>>(
+              std::make_unique<SharingFCMHandler>(nullptr, nullptr));
+        }));
+    observer_ = std::make_unique<ClickToCallContextMenuObserver>(&menu_);
+    menu_.SetObserver(observer_.get());
+  }
+
+  void InitMenu(const GURL& url) {
+    content::ContextMenuParams params;
+    params.link_url = url;
+    observer_->InitMenu(params);
+    sharing_message.mutable_click_to_call_message()->set_phone_number(
+        url.GetContent());
+  }
+
+  std::vector<SharingDeviceInfo> CreateMockDevices(int count) {
+    std::vector<SharingDeviceInfo> devices;
+    for (int i = 0; i < count; i++) {
+      devices.emplace_back(
+          base::StrCat({"guid", base::NumberToString(i)}),
+          base::StrCat({"name", base::NumberToString(i)}),
+          sync_pb::SyncEnums::TYPE_PHONE, base::Time::Now(),
+          static_cast<int>(SharingDeviceCapability::kTelephony));
+    }
+    return devices;
+  }
+
+ protected:
+  NiceMock<MockSharingService>* service() {
+    return static_cast<NiceMock<MockSharingService>*>(
+        SharingServiceFactory::GetForBrowserContext(menu_.GetBrowserContext()));
+  }
+
+  content::TestBrowserThreadBundle thread_bundle_;
+  MockRenderViewContextMenu menu_{/* incognito= */ false};
+  std::unique_ptr<ClickToCallContextMenuObserver> observer_;
+  SharingMessage sharing_message;
+
+  DISALLOW_COPY_AND_ASSIGN(ClickToCallContextMenuObserverTest);
+};
+
+}  // namespace
+
+MATCHER_P(ProtoEquals, message, "") {
+  std::string expected_serialized, actual_serialized;
+  message.SerializeToString(&expected_serialized);
+  arg.SerializeToString(&actual_serialized);
+  return expected_serialized == actual_serialized;
+}
+
+TEST_F(ClickToCallContextMenuObserverTest, NoDevices_DoNotShowMenu) {
+  auto devices = CreateMockDevices(0);
+
+  EXPECT_CALL(*service(), GetDeviceCandidates(_))
+      .WillOnce(Return(ByMove(std::move(devices))));
+
+  InitMenu(GURL(kTelUrl));
+
+  EXPECT_EQ(0U, menu_.GetMenuSize());
+}
+
+TEST_F(ClickToCallContextMenuObserverTest, SingleDevice_ShowMenu) {
+  auto devices = CreateMockDevices(1);
+  auto guid = devices[0].guid();
+
+  EXPECT_CALL(*service(), GetDeviceCandidates(_))
+      .WillOnce(Return(ByMove(std::move(devices))));
+
+  InitMenu(GURL(kTelUrl));
+
+  // The first item is a separator and the second item is the device.
+  EXPECT_EQ(2U, menu_.GetMenuSize());
+
+  // Assert item ordering.
+  MockRenderViewContextMenu::MockMenuItem item;
+  ASSERT_TRUE(menu_.GetMenuItem(0, &item));
+  EXPECT_EQ(kSeparatorCommandId, item.command_id);
+
+  ASSERT_TRUE(menu_.GetMenuItem(1, &item));
+  EXPECT_EQ(IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE,
+            item.command_id);
+
+  // Emulate click on the device.
+  EXPECT_CALL(*service(),
+              SendMessageToDevice(Eq(guid), Eq(kSharingClickToCallMessageTTL),
+                                  ProtoEquals(sharing_message), _))
+      .Times(1);
+  menu_.ExecuteCommand(IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE,
+                       0);
+}
+
+TEST_F(ClickToCallContextMenuObserverTest, MultipleDevices_ShowMenu) {
+  constexpr int device_count = 3;
+  auto devices = CreateMockDevices(device_count);
+  std::vector<std::string> guids;
+  for (auto& device : devices)
+    guids.push_back(device.guid());
+
+  EXPECT_CALL(*service(), GetDeviceCandidates(_))
+      .WillOnce(Return(ByMove(std::move(devices))));
+
+  InitMenu(GURL(kTelUrl));
+
+  EXPECT_EQ(device_count + 2U, menu_.GetMenuSize());
+
+  // Assert item ordering.
+  MockRenderViewContextMenu::MockMenuItem item;
+  ASSERT_TRUE(menu_.GetMenuItem(0, &item));
+  EXPECT_EQ(kSeparatorCommandId, item.command_id);
+
+  ASSERT_TRUE(menu_.GetMenuItem(1, &item));
+  EXPECT_EQ(IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES,
+            item.command_id);
+
+  for (int i = 0; i < device_count; i++) {
+    ASSERT_TRUE(menu_.GetMenuItem(i + 2, &item));
+    EXPECT_EQ(kSubMenuFirstDeviceCommandId + i, item.command_id);
+  }
+
+  // Emulate clicks on all commands to check for commands with no device
+  // assigned.
+  for (int i = 0; i < kMaxDevicesShown; i++) {
+    if (i < device_count) {
+      EXPECT_CALL(
+          *service(),
+          SendMessageToDevice(Eq(guids[i]), Eq(kSharingClickToCallMessageTTL),
+                              ProtoEquals(sharing_message), _))
+          .Times(1);
+    } else {
+      EXPECT_CALL(*service(), SendMessageToDevice(_, _, _, _)).Times(0);
+    }
+    observer_->sub_menu_delegate_.ExecuteCommand(
+        kSubMenuFirstDeviceCommandId + i, 0);
+  }
+}
+
+TEST_F(ClickToCallContextMenuObserverTest,
+       MultipleDevices_MoreThanMax_ShowMenu) {
+  int device_count = kMaxDevicesShown + 1;
+  auto devices = CreateMockDevices(device_count);
+  std::vector<std::string> guids;
+  for (auto& device : devices)
+    guids.push_back(device.guid());
+
+  EXPECT_CALL(*service(), GetDeviceCandidates(_))
+      .WillOnce(Return(ByMove(std::move(devices))));
+
+  InitMenu(GURL(kTelUrl));
+
+  EXPECT_EQ(kMaxDevicesShown + 2U, menu_.GetMenuSize());
+
+  // Assert item ordering.
+  MockRenderViewContextMenu::MockMenuItem item;
+  ASSERT_TRUE(menu_.GetMenuItem(0, &item));
+  EXPECT_EQ(kSeparatorCommandId, item.command_id);
+
+  ASSERT_TRUE(menu_.GetMenuItem(1, &item));
+  EXPECT_EQ(IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES,
+            item.command_id);
+
+  for (int i = 0; i < kMaxDevicesShown; i++) {
+    ASSERT_TRUE(menu_.GetMenuItem(i + 2, &item));
+    EXPECT_EQ(kSubMenuFirstDeviceCommandId + i, item.command_id);
+  }
+
+  // Emulate clicks on all device commands to check for commands outside valid
+  // range too.
+  for (int i = 0; i < device_count; i++) {
+    if (i < kMaxDevicesShown) {
+      EXPECT_CALL(
+          *service(),
+          SendMessageToDevice(Eq(guids[i]), Eq(kSharingClickToCallMessageTTL),
+                              ProtoEquals(sharing_message), _))
+          .Times(1);
+    } else {
+      EXPECT_CALL(*service(), SendMessageToDevice(_, _, _, _)).Times(0);
+    }
+    observer_->sub_menu_delegate_.ExecuteCommand(
+        kSubMenuFirstDeviceCommandId + i, 0);
+  }
+}
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_utils.cc b/chrome/browser/sharing/click_to_call/click_to_call_utils.cc
new file mode 100644
index 0000000..c0b43b2
--- /dev/null
+++ b/chrome/browser/sharing/click_to_call/click_to_call_utils.cc
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/sharing/click_to_call/click_to_call_utils.h"
+
+#include "chrome/browser/sharing/click_to_call/feature.h"
+#include "chrome/browser/sharing/sharing_service.h"
+#include "chrome/browser/sharing/sharing_service_factory.h"
+#include "content/public/browser/browser_context.h"
+#include "url/url_constants.h"
+
+bool ShouldOfferClickToCall(content::BrowserContext* browser_context,
+                            const GURL& url) {
+  SharingService* sharing_service =
+      SharingServiceFactory::GetForBrowserContext(browser_context);
+  return sharing_service &&
+         (sharing_service->GetState() == SharingService::State::ACTIVE) &&
+         base::FeatureList::IsEnabled(kClickToCallUI) &&
+         url.SchemeIs(url::kTelScheme) && !url.GetContent().empty();
+}
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_utils.h b/chrome/browser/sharing/click_to_call/click_to_call_utils.h
new file mode 100644
index 0000000..5b30ec1
--- /dev/null
+++ b/chrome/browser/sharing/click_to_call/click_to_call_utils.h
@@ -0,0 +1,17 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_UTILS_H_
+#define CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_UTILS_H_
+
+#include "url/gurl.h"
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+bool ShouldOfferClickToCall(content::BrowserContext* browser_context,
+                            const GURL& url);
+
+#endif  // CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_UTILS_H_
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_utils_unittest.cc b/chrome/browser/sharing/click_to_call/click_to_call_utils_unittest.cc
new file mode 100644
index 0000000..dd521c6
--- /dev/null
+++ b/chrome/browser/sharing/click_to_call/click_to_call_utils_unittest.cc
@@ -0,0 +1,119 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h"
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/sharing/click_to_call/click_to_call_utils.h"
+#include "chrome/browser/sharing/click_to_call/feature.h"
+#include "chrome/browser/sharing/sharing_fcm_handler.h"
+#include "chrome/browser/sharing/sharing_fcm_sender.h"
+#include "chrome/browser/sharing/sharing_service.h"
+#include "chrome/browser/sharing/sharing_service_factory.h"
+#include "chrome/browser/sharing/sharing_sync_preference.h"
+#include "chrome/browser/sharing/vapid_key_manager.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+using ::testing::_;
+using ::testing::ByMove;
+using ::testing::Eq;
+using ::testing::NiceMock;
+using ::testing::Return;
+
+using SharingMessage = chrome_browser_sharing::SharingMessage;
+
+namespace {
+
+const char kEmptyTelUrl[] = "tel:";
+const char kTelUrl[] = "tel:+9876543210";
+const char kNonTelUrl[] = "https://google.com";
+
+class MockSharingService : public SharingService {
+ public:
+  explicit MockSharingService(std::unique_ptr<SharingFCMHandler> fcm_handler)
+      : SharingService(nullptr,
+                       nullptr,
+                       nullptr,
+                       nullptr,
+                       std::move(fcm_handler),
+                       nullptr,
+                       nullptr,
+                       nullptr) {}
+
+  ~MockSharingService() override = default;
+
+  MOCK_CONST_METHOD0(GetState, State());
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockSharingService);
+};
+
+class ClickToCallUtilsTest : public testing::Test {
+ public:
+  ClickToCallUtilsTest() = default;
+
+  ~ClickToCallUtilsTest() override = default;
+
+  void SetUp() override {
+    SharingServiceFactory::GetInstance()->SetTestingFactory(
+        &profile_, base::BindRepeating([](content::BrowserContext* context)
+                                           -> std::unique_ptr<KeyedService> {
+          return std::make_unique<NiceMock<MockSharingService>>(
+              std::make_unique<SharingFCMHandler>(nullptr, nullptr));
+        }));
+  }
+
+ protected:
+  NiceMock<MockSharingService>* service() {
+    return static_cast<NiceMock<MockSharingService>*>(
+        SharingServiceFactory::GetForBrowserContext(&profile_));
+  }
+
+  base::test::ScopedFeatureList scoped_feature_list_;
+  content::TestBrowserThreadBundle thread_bundle_;
+  TestingProfile profile_;
+
+  DISALLOW_COPY_AND_ASSIGN(ClickToCallUtilsTest);
+};
+
+}  // namespace
+
+TEST_F(ClickToCallUtilsTest, NonTelProtocol_DoNotShowMenu) {
+  scoped_feature_list_.InitAndEnableFeature(kClickToCallUI);
+  EXPECT_CALL(*service(), GetState())
+      .WillOnce(Return(SharingService::State::ACTIVE));
+
+  EXPECT_FALSE(ShouldOfferClickToCall(&profile_, GURL(kNonTelUrl)));
+}
+
+TEST_F(ClickToCallUtilsTest, UIFlagDisabled_DoNotShowMenu) {
+  scoped_feature_list_.InitAndDisableFeature(kClickToCallUI);
+  EXPECT_CALL(*service(), GetState())
+      .WillOnce(Return(SharingService::State::ACTIVE));
+
+  EXPECT_FALSE(ShouldOfferClickToCall(&profile_, GURL(kTelUrl)));
+}
+
+TEST_F(ClickToCallUtilsTest, EmptyTelProtocol_DoNotShowMenu) {
+  scoped_feature_list_.InitAndEnableFeature(kClickToCallUI);
+  EXPECT_CALL(*service(), GetState())
+      .WillOnce(Return(SharingService::State::ACTIVE));
+
+  EXPECT_FALSE(ShouldOfferClickToCall(&profile_, GURL(kEmptyTelUrl)));
+}
+
+TEST_F(ClickToCallUtilsTest, TelProtocol_ShowMenu) {
+  scoped_feature_list_.InitAndEnableFeature(kClickToCallUI);
+  EXPECT_CALL(*service(), GetState())
+      .WillOnce(Return(SharingService::State::ACTIVE));
+
+  EXPECT_TRUE(ShouldOfferClickToCall(&profile_, GURL(kTelUrl)));
+}
diff --git a/chrome/browser/sharing/sharing_service.h b/chrome/browser/sharing/sharing_service.h
index 242c5d33..b51f288 100644
--- a/chrome/browser/sharing/sharing_service.h
+++ b/chrome/browser/sharing/sharing_service.h
@@ -88,7 +88,7 @@
       SharingMessageHandler* handler);
 
   // Returns the current state of SharingService.
-  State GetState() const;
+  virtual State GetState() const;
 
  private:
   // Overrides for syncer::SyncServiceObserver.
diff --git a/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_app_result.cc b/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_app_result.cc
index 2c1d6b4..1f6691cd 100644
--- a/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_app_result.cc
+++ b/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_app_result.cc
@@ -33,6 +33,8 @@
   SetResultType(ash::SearchResultType::kPlayStoreReinstallApp);
   SetTitle(base::UTF8ToUTF16(mojom_data->title));
   SetDisplayType(ash::SearchResultDisplayType::kRecommendation);
+  SetDisplayLocation(ash::SearchResultDisplayLocation::kTileListContainer);
+  SetDisplayIndex(ash::SearchResultDisplayIndex::kSixthIndex);
   set_relevance(kAppReinstallRelevance);
   SetNotifyVisibilityChange(true);
   SetIcon(skia_icon);
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc
index b5b4b3d9..4ca944e7c 100644
--- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc
+++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc
@@ -363,11 +363,9 @@
   keyboard_contents_.reset();
 }
 
-void ChromeKeyboardControllerClient::OnKeyboardContentsLoaded(
-    const gfx::Size& size) {
-  DVLOG(1) << "OnLoadKeyboardContentsRequested: " << size.ToString();
+void ChromeKeyboardControllerClient::OnKeyboardContentsLoaded() {
+  DVLOG(1) << "OnKeyboardContentsLoaded";
   NotifyKeyboardLoaded();
-  keyboard_controller_->KeyboardContentsLoaded(size);
 }
 
 void ChromeKeyboardControllerClient::OnSessionStateChanged() {
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h
index 0f5200ea..df1f91e 100644
--- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h
+++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h
@@ -153,7 +153,8 @@
   void OnLoadKeyboardContentsRequested() override;
   void OnKeyboardUIDestroyed() override;
 
-  void OnKeyboardContentsLoaded(const gfx::Size& size);
+  // Called when the keyboard contents have loaded. Notifies observers.
+  void OnKeyboardContentsLoaded();
 
   // session_manager::SessionManagerObserver:
   void OnSessionStateChanged() override;
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc
index 8156ee7..c45c7f5 100644
--- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc
+++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc
@@ -23,7 +23,6 @@
   ~FakeKeyboardController() override = default;
 
   // ash::KeyboardController:
-  void KeyboardContentsLoaded(const gfx::Size& size) override {}
   keyboard::KeyboardConfig GetKeyboardConfig() override {
     return keyboard_config_;
   }
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui.cc
index 7481433..02e6718 100644
--- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui.cc
+++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui.cc
@@ -49,7 +49,7 @@
       browser_context_,
       ChromeKeyboardControllerClient::Get()->GetVirtualKeyboardUrl(),
       base::BindOnce(
-          [](LoadCallback callback, const gfx::Size&) {
+          [](LoadCallback callback) {
             ChromeKeyboardControllerClient::Get()->NotifyKeyboardLoaded();
             std::move(callback).Run();
           },
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc
index 4661b8ca..cd826d9d 100644
--- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc
+++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc
@@ -224,7 +224,7 @@
   // TODO(https://crbug.com/845780): Change this to a DCHECK when we change
   // ReloadKeyboardIfNeeded to also have a callback.
   if (!load_callback_.is_null())
-    std::move(load_callback_).Run(gfx::Size());
+    std::move(load_callback_).Run();
 }
 
 void ChromeKeyboardWebContents::LoadContents(const GURL& url) {
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.h b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.h
index 4bbfde70d..53f141c 100644
--- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.h
+++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.h
@@ -29,7 +29,7 @@
 class ChromeKeyboardWebContents : public content::WebContentsObserver,
                                   public aura::WindowObserver {
  public:
-  using LoadCallback = base::OnceCallback<void(const gfx::Size& size)>;
+  using LoadCallback = base::OnceCallback<void()>;
   using UnembedCallback = base::RepeatingClosure;
 
   // Immediately starts loading |url| in a WebContents. |load_callback| is
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 1adf835..f921fe6 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -2104,6 +2104,7 @@
       chrome::NOTIFICATION_TAB_CLOSING,
       content::Source<NavigationController>(&contents->GetController()),
       content::NotificationService::NoDetails());
+  SearchTabHelper::FromWebContents(contents)->OnTabClosing();
 }
 
 void Browser::OnTabDetached(WebContents* contents, bool was_active) {
diff --git a/chrome/browser/ui/search/local_ntp_browsertest.cc b/chrome/browser/ui/search/local_ntp_browsertest.cc
index 1bac48c2..ed0add4b 100644
--- a/chrome/browser/ui/search/local_ntp_browsertest.cc
+++ b/chrome/browser/ui/search/local_ntp_browsertest.cc
@@ -1226,39 +1226,6 @@
 };
 
 IN_PROC_BROWSER_TEST_F(LocalNTPExistingProfileSearchShortcutTest,
-                       SearchShortcutAdded) {
-  TestInstantServiceObserver observer(
-      InstantServiceFactory::GetForProfile(browser()->profile()));
-
-  content::WebContents* active_tab =
-      local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
-  local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser());
-  ASSERT_TRUE(search::IsInstantNTP(active_tab));
-  content::RenderFrameHost* iframe = GetIframe(active_tab, kMostVisitedIframe);
-  EXPECT_FALSE(ContainsDefaultSearchTile(iframe));
-
-  // Navigate to a non-NTP URL, which should update most visited tiles.
-  ASSERT_TRUE(embedded_test_server()->Start());
-  GURL url(embedded_test_server()->GetURL("/title2.html"));
-  ui_test_utils::NavigateToURL(browser(), url);
-  ASSERT_FALSE(search::IsInstantNTP(active_tab));
-
-  // Enable the feature to insert the search shortcut for existing profiles.
-  base::test::ScopedFeatureList scoped_feature_list_;
-  scoped_feature_list_.InitAndEnableFeature(ntp_tiles::kDefaultSearchShortcut);
-  ASSERT_TRUE(base::FeatureList::IsEnabled(ntp_tiles::kDefaultSearchShortcut));
-
-  // Two new tiles (the non-NTP URL and the search shortcut) should be added.
-  observer.WaitForMostVisitedItems(kDefaultMostVisitedItemCount + 2);
-
-  active_tab = local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
-  local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser());
-  ASSERT_TRUE(search::IsInstantNTP(active_tab));
-  iframe = GetIframe(active_tab, kMostVisitedIframe);
-  EXPECT_TRUE(ContainsDefaultSearchTile(iframe));
-}
-
-IN_PROC_BROWSER_TEST_F(LocalNTPExistingProfileSearchShortcutTest,
                        PRE_FRESearchShortcutNotAddedForExistingUsers) {
   TestInstantServiceObserver observer(
       InstantServiceFactory::GetForProfile(browser()->profile()));
@@ -1351,4 +1318,103 @@
   EXPECT_THAT(request_headers, ::testing::HasSubstr("same-site-cookie=1"));
 }
 
+// Verifies that Chrome won't spawn a separate renderer process for
+// every single NTP tab.  This behavior goes all the way back to
+// the initial commit [1] which achieved that behavior by forcing
+// process-per-site mode for NTP tabs.  It seems desirable to preserve this
+// behavior going forward.
+//
+// [1] https://chromium.googlesource.com/chromium/src/+/09911bf300f1a419907a9412154760efd0b7abc3/chrome/browser/browsing_instance.cc#55
+IN_PROC_BROWSER_TEST_F(LocalNTPTest, ProcessPerSite) {
+  GURL ntp_url("chrome-search://local-ntp/local-ntp.html");
+
+  // Open NTP in |tab1|.
+  content::WebContents* tab1;
+  {
+    content::WebContentsAddedObserver tab1_observer;
+
+    // Try to simulate as closely as possible what would have happened in the
+    // real user interaction.  In particular, do *not* use
+    // local_ntp_test_utils::OpenNewTab, which requires the caller to specify
+    // the URL of the new tab.
+    chrome::NewTab(browser());
+
+    // Wait for the new tab.
+    tab1 = tab1_observer.GetWebContents();
+    ASSERT_TRUE(WaitForLoadStop(tab1));
+
+    // Sanity check: the NTP should be provided by |ntp_url| (and not by
+    // chrome-search://remote-ntp [3rd-party NTP] or chrome://ntp [incognito]).
+    std::string loc;
+    EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+        tab1, "domAutomationController.send(window.location.href)", &loc));
+    EXPECT_EQ(ntp_url, GURL(loc));
+  }
+
+  // Open another NTP in |tab2|.
+  content::WebContents* tab2;
+  {
+    content::WebContentsAddedObserver tab2_observer;
+    chrome::NewTab(browser());
+    tab2 = tab2_observer.GetWebContents();
+    ASSERT_TRUE(WaitForLoadStop(tab2));
+    std::string loc;
+    EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+        tab2, "domAutomationController.send(window.location.href)", &loc));
+    EXPECT_EQ(ntp_url, GURL(loc));
+  }
+
+  // Verify that |tab1| and |tab2| share a process.
+  EXPECT_EQ(tab1->GetMainFrame()->GetProcess(),
+            tab2->GetMainFrame()->GetProcess());
+}
+
+// Just like LocalNTPTest.ProcessPerSite, but for an incognito window.
+IN_PROC_BROWSER_TEST_F(LocalNTPTest, ProcessPerSite_Incognito) {
+  GURL ntp_url("chrome://newtab");
+  Browser* incognito_browser = new Browser(Browser::CreateParams(
+      browser()->profile()->GetOffTheRecordProfile(), true));
+
+  // Open NTP in |tab1|.
+  content::WebContents* tab1;
+  {
+    content::WebContentsAddedObserver tab1_observer;
+
+    // Try to simulate as closely as possible what would have happened in the
+    // real user interaction.  In particular, do *not* use
+    // local_ntp_test_utils::OpenNewTab, which requires the caller to specify
+    // the URL of the new tab.
+    chrome::NewTab(incognito_browser);
+
+    // Wait for the new tab.
+    tab1 = tab1_observer.GetWebContents();
+    ASSERT_TRUE(WaitForLoadStop(tab1));
+
+    // Sanity check: the NTP should be provided by |ntp_url| (and not by
+    // chrome-search://local-ntp [1st-party, non-incognito NTP] or
+    // chrome-search://remote-ntp [3rd-party NTP]).
+    std::string loc;
+    EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+        tab1, "domAutomationController.send(window.location.href)", &loc));
+    EXPECT_EQ(ntp_url, GURL(loc));
+  }
+
+  // Open another NTP in |tab2|.
+  content::WebContents* tab2;
+  {
+    content::WebContentsAddedObserver tab2_observer;
+    chrome::NewTab(incognito_browser);
+    tab2 = tab2_observer.GetWebContents();
+    ASSERT_TRUE(WaitForLoadStop(tab2));
+    std::string loc;
+    EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+        tab2, "domAutomationController.send(window.location.href)", &loc));
+    EXPECT_EQ(ntp_url, GURL(loc));
+  }
+
+  // Verify that |tab1| and |tab2| share a process.
+  EXPECT_EQ(tab1->GetMainFrame()->GetProcess(),
+            tab2->GetMainFrame()->GetProcess());
+}
+
 }  // namespace
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc
index e146376..706435c 100644
--- a/chrome/browser/ui/search/search_tab_helper.cc
+++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -153,6 +153,11 @@
   ipc_router_.OnTabDeactivated();
 }
 
+void SearchTabHelper::OnTabClosing() {
+  if (search::IsInstantNTP(web_contents_) && chrome_colors_service_)
+    chrome_colors_service_->RevertThemeChangesForTab(web_contents_);
+}
+
 void SearchTabHelper::DidStartNavigation(
     content::NavigationHandle* navigation_handle) {
   if (!navigation_handle->IsInMainFrame() ||
@@ -466,12 +471,12 @@
 
 void SearchTabHelper::OnApplyDefaultTheme() {
   if (chrome_colors_service_)
-    chrome_colors_service_->ApplyDefaultTheme();
+    chrome_colors_service_->ApplyDefaultTheme(web_contents_);
 }
 
 void SearchTabHelper::OnApplyAutogeneratedTheme(SkColor color) {
   if (chrome_colors_service_)
-    chrome_colors_service_->ApplyAutogeneratedTheme(color);
+    chrome_colors_service_->ApplyAutogeneratedTheme(color, web_contents_);
 }
 
 void SearchTabHelper::OnRevertThemeChanges() {
diff --git a/chrome/browser/ui/search/search_tab_helper.h b/chrome/browser/ui/search/search_tab_helper.h
index 7360493d..7de6e6b 100644
--- a/chrome/browser/ui/search/search_tab_helper.h
+++ b/chrome/browser/ui/search/search_tab_helper.h
@@ -65,6 +65,9 @@
   // Called when the tab corresponding to |this| instance is deactivated.
   void OnTabDeactivated();
 
+  // Called when the tab corresponding to |this| instance is closing.
+  void OnTabClosing();
+
   SearchIPCRouter& ipc_router_for_testing() { return ipc_router_; }
 
  private:
diff --git a/chrome/browser/ui/search/third_party_ntp_browsertest.cc b/chrome/browser/ui/search/third_party_ntp_browsertest.cc
index 83e24a4..be222660 100644
--- a/chrome/browser/ui/search/third_party_ntp_browsertest.cc
+++ b/chrome/browser/ui/search/third_party_ntp_browsertest.cc
@@ -7,6 +7,7 @@
 #include "chrome/browser/search/instant_service.h"
 #include "chrome/browser/search/instant_service_factory.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/search/instant_test_base.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -48,7 +49,6 @@
   GURL ntp_url =
       https_test_server().GetURL("ntp.com", "/instant_extended_ntp.html");
   InstantTestBase::Init(base_url, ntp_url, false);
-
   SetupInstant(browser());
 
   // Navigate to the NTP URL and verify that the resulting process is marked as
@@ -81,3 +81,53 @@
       &subframe_origin));
   EXPECT_EQ("chrome-search://most-visited", subframe_origin);
 }
+
+// Verifies that Chrome won't spawn a separate renderer process for
+// every single NTP tab.  This behavior goes all the way back to
+// the initial commit [1] which achieved that behavior by forcing
+// process-per-site mode for NTP tabs.  It seems desirable to preserve this
+// behavior going forward.
+//
+// [1] https://chromium.googlesource.com/chromium/src/+/09911bf300f1a419907a9412154760efd0b7abc3/chrome/browser/browsing_instance.cc#55
+IN_PROC_BROWSER_TEST_F(ThirdPartyNTPBrowserTest, ProcessPerSite) {
+  GURL base_url =
+      https_test_server().GetURL("ntp.com", "/instant_extended.html");
+  GURL ntp_url =
+      https_test_server().GetURL("ntp.com", "/instant_extended_ntp.html");
+  InstantTestBase::Init(base_url, ntp_url, false);
+  SetupInstant(browser());
+
+  // Open NTP in |tab1|.
+  content::WebContents* tab1;
+  {
+    content::WebContentsAddedObserver tab1_observer;
+
+    // Try to simulate as closely as possible what would have happened in the
+    // real user interaction.  In particular, do *not* use
+    // local_ntp_test_utils::OpenNewTab, which requires the caller to specify
+    // the URL of the new tab.
+    chrome::NewTab(browser());
+
+    // Wait for the new tab.
+    tab1 = tab1_observer.GetWebContents();
+    ASSERT_TRUE(WaitForLoadStop(tab1));
+
+    // Sanity check: the NTP should be provided by |ntp_url| (and not by
+    // chrome-search://local-ntp [1st-party NTP] or chrome://ntp [incognito]).
+    EXPECT_EQ(ntp_url, content::EvalJs(tab1, "window.location.href"));
+  }
+
+  // Open another NTP in |tab2|.
+  content::WebContents* tab2;
+  {
+    content::WebContentsAddedObserver tab2_observer;
+    chrome::NewTab(browser());
+    tab2 = tab2_observer.GetWebContents();
+    ASSERT_TRUE(WaitForLoadStop(tab2));
+    EXPECT_EQ(ntp_url, content::EvalJs(tab2, "window.location.href"));
+  }
+
+  // Verify that |tab1| and |tab2| share a process.
+  EXPECT_EQ(tab1->GetMainFrame()->GetProcess(),
+            tab2->GetMainFrame()->GetProcess());
+}
diff --git a/chrome/browser/ui/views/hover_button.cc b/chrome/browser/ui/views/hover_button.cc
index 63f89d2ac..2004c8c 100644
--- a/chrome/browser/ui/views/hover_button.cc
+++ b/chrome/browser/ui/views/hover_button.cc
@@ -77,6 +77,8 @@
   SetBorder(CreateBorderWithVerticalSpacing(vert_spacing));
 
   SetInkDropMode(InkDropMode::ON);
+
+  set_notify_action(Button::NOTIFY_ON_RELEASE);
 }
 
 HoverButton::HoverButton(views::ButtonListener* button_listener,
@@ -236,20 +238,6 @@
   Button::GetAccessibleNodeData(node_data);
 }
 
-bool HoverButton::IsTriggerableEventType(const ui::Event& event) {
-  // Override MenuButton::IsTriggerableEventType so the HoverButton only
-  // triggers on mouse-button release, like normal buttons.
-  if (event.IsMouseEvent()) {
-    // The button listener must only be notified when the mouse was released.
-    // The event type must be explicitly checked here, since
-    // Button::IsTriggerableEvent() returns true on the mouse-down event.
-    return Button::IsTriggerableEvent(event) &&
-           event.type() == ui::ET_MOUSE_RELEASED;
-  }
-
-  return MenuButton::IsTriggerableEventType(event);
-}
-
 gfx::Insets HoverButton::GetInsets() const {
   if (insets_)
     return insets_.value();
diff --git a/chrome/browser/ui/views/hover_button.h b/chrome/browser/ui/views/hover_button.h
index 820bf2a..168f30a 100644
--- a/chrome/browser/ui/views/hover_button.h
+++ b/chrome/browser/ui/views/hover_button.h
@@ -66,7 +66,6 @@
   bool OnKeyPressed(const ui::KeyEvent& event) override;
   void SetBorder(std::unique_ptr<views::Border> b) override;
   void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
-  bool IsTriggerableEventType(const ui::Event& event) override;
   gfx::Insets GetInsets() const override;
 
   // Updates the title text, and applies the secondary style to the text
diff --git a/chrome/browser/ui/views/hover_button_unittest.cc b/chrome/browser/ui/views/hover_button_unittest.cc
index 84150a80..8b72ce2f 100644
--- a/chrome/browser/ui/views/hover_button_unittest.cc
+++ b/chrome/browser/ui/views/hover_button_unittest.cc
@@ -11,11 +11,13 @@
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/accessibility/ax_node_data.h"
+#include "ui/events/test/event_generator.h"
 #include "ui/gfx/text_utils.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/test/views_test_base.h"
 #include "ui/views/view.h"
+#include "ui/views/widget/widget_utils.h"
 
 namespace {
 
@@ -45,17 +47,58 @@
  public:
   HoverButtonTest() {}
 
+  void SetUp() override {
+    ChromeViewsTestBase::SetUp();
+    CreateWidget();
+    generator_ = std::make_unique<ui::test::EventGenerator>(
+        GetRootWindow(widget_.get()), widget_->GetNativeWindow());
+  }
+
+  void TearDown() override {
+    widget_.reset();
+    generator_.reset();
+    ChromeViewsTestBase::TearDown();
+  }
+
   std::unique_ptr<views::View> CreateIcon() {
     auto icon = std::make_unique<views::View>();
     icon->SetPreferredSize(gfx::Size(16, 16));
     return icon;
   }
 
+  ui::test::EventGenerator* generator() { return generator_.get(); }
+  views::Widget* widget() { return widget_.get(); }
+
+  void CreateWidget() {
+    widget_ = std::make_unique<views::Widget>();
+    views::Widget::InitParams params =
+        CreateParams(views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
+    params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+    params.bounds = gfx::Rect(100, 100, 200, 200);
+    widget_->Init(params);
+  }
+
  private:
+  std::unique_ptr<views::Widget> widget_;
+  std::unique_ptr<ui::test::EventGenerator> generator_;
   DISALLOW_COPY_AND_ASSIGN(HoverButtonTest);
 };
 
-}  // namespace
+class TestButtonListener : public views::ButtonListener {
+ public:
+  TestButtonListener() = default;
+  ~TestButtonListener() override = default;
+
+  void ButtonPressed(views::Button* sender, const ui::Event& event) override {
+    last_sender_ = sender;
+  }
+
+  views::View* last_sender() { return last_sender_; }
+
+ private:
+  views::View* last_sender_ = nullptr;
+  DISALLOW_COPY_AND_ASSIGN(TestButtonListener);
+};
 
 // Double check the length of the strings used for testing are either over or
 // under the width used for the following tests.
@@ -160,3 +203,24 @@
   EXPECT_TRUE(button.Contains(primary_icon_raw));
   EXPECT_TRUE(button.Contains(secondary_icon_raw));
 }
+
+// Tests that the listener is notified on mouse release rather than mouse press.
+TEST_F(HoverButtonTest, ActivatesOnMouseReleased) {
+  TestButtonListener button_listener;
+  HoverButton button(&button_listener, CreateIcon(),
+                     base::ASCIIToUTF16("Title"), base::string16());
+
+  button.SetBoundsRect(gfx::Rect(100, 100, 200, 200));
+  widget()->SetContentsView(&button);
+  widget()->Show();
+
+  // ButtonListener should not be activated on press.
+  generator()->PressLeftButton();
+  EXPECT_EQ(nullptr, button_listener.last_sender());
+
+  // ButtonListener should be activated on release.
+  generator()->ReleaseLeftButton();
+  EXPECT_EQ(&button, button_listener.last_sender());
+}
+
+}  // namespace
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
index 2a683cf..21cac69 100644
--- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
+++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
@@ -46,6 +46,8 @@
 #endif
 
 namespace {
+// Maximum number of lines that a title label occupies.
+int kTitleMaxLines = 2;
 
 // Hover card and preview image dimensions.
 int GetPreferredTabHoverCardWidth() {
@@ -298,7 +300,8 @@
       new views::Label(base::string16(), CONTEXT_TAB_HOVER_CARD_TITLE,
                        views::style::STYLE_PRIMARY);
   title_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  title_label_->SetMultiLine(false);
+  title_label_->SetMultiLine(true);
+  title_label_->SetMaxLines(kTitleMaxLines);
   AddChildView(title_label_);
 
   domain_label_ =
diff --git a/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc b/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
index 89b2cd3..6f6e5f0 100644
--- a/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
+++ b/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
@@ -8,7 +8,6 @@
 
 #include "base/bind.h"
 #include "base/location.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
@@ -225,20 +224,10 @@
   bool alert_reopen_tab_items =
       promo_feature_ == InProductHelpFeature::kReopenTab;
 
-  base::TimeTicks menu_open_time = base::TimeTicks::Now();
-
   RunMenu(
       std::make_unique<AppMenuModel>(toolbar_view_, browser,
                                      toolbar_view_->app_menu_icon_controller()),
       browser, run_types, alert_reopen_tab_items);
-
-  if (!(run_types & views::MenuRunner::FOR_DROP)) {
-    // Record the time-to-action for the menu. We don't record in the case of a
-    // drag-and-drop command because menus opened for drag-and-drop don't block
-    // the message loop.
-    UMA_HISTOGRAM_TIMES("Toolbar.AppMenuTimeToAction",
-                        base::TimeTicks::Now() - menu_open_time);
-  }
 }
 
 void BrowserAppMenuButton::OnThemeChanged() {
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view.cc b/chrome/browser/ui/views/toolbar/toolbar_action_view.cc
index 73dabfe..0ad533c 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_action_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_action_view.cc
@@ -126,7 +126,7 @@
   // closed the menu, when this class handles via |suppress_next_release_|, so
   // it's not necessary.  Bypass it by calling IsTriggerableEventType() instead
   // of IsTriggerableEvent().
-  return views::MenuButton::IsTriggerableEventType(event);
+  return button_controller()->IsTriggerableEventType(event);
 }
 
 SkColor ToolbarActionView::GetInkDropBaseColor() const {
diff --git a/chrome/browser/ui/webui/OWNERS b/chrome/browser/ui/webui/OWNERS
index 5e97af03..be3a2059 100644
--- a/chrome/browser/ui/webui/OWNERS
+++ b/chrome/browser/ui/webui/OWNERS
@@ -25,5 +25,6 @@
 per-file invalidations_message_handler.*=file://components/invalidation/OWNERS
 
 per-file policy*=file://chromeos/policy/OWNERS
+per-file policy*=file://chrome/browser/policy/OWNERS
 
 # COMPONENT: UI>Browser>WebUI
diff --git a/chrome/browser/ui/webui/policy_ui_handler.cc b/chrome/browser/ui/webui/policy_ui_handler.cc
index c1d71edb..85b71b8 100644
--- a/chrome/browser/ui/webui/policy_ui_handler.cc
+++ b/chrome/browser/ui/webui/policy_ui_handler.cc
@@ -926,7 +926,8 @@
   return policy::GetAllPolicyValuesAsArray(
       web_ui()->GetWebContents()->GetBrowserContext(),
       true /* with_user_policies */, true /* convert_values */,
-      false /* with_device_data */, true /* is_pretty_print */);
+      false /* with_device_data */, true /* is_pretty_print */,
+      true /* convert_types */);
 }
 
 void PolicyUIHandler::SendStatus() {
@@ -1033,7 +1034,7 @@
   base::Value dict = policy::GetAllPolicyValuesAsDictionary(
       web_ui()->GetWebContents()->GetBrowserContext(),
       true /* with_user_policies */, false /* convert_values */,
-      false /* with_device_data */, is_pretty_print);
+      false /* with_device_data */, is_pretty_print, true /* convert_types */);
 
   base::Value chrome_metadata(base::Value::Type::DICTIONARY);
 
diff --git a/chrome/browser/ui/webui/settings/printing_handler.cc b/chrome/browser/ui/webui/settings/printing_handler.cc
index 8647b2d..deaa3ab 100644
--- a/chrome/browser/ui/webui/settings/printing_handler.cc
+++ b/chrome/browser/ui/webui/settings/printing_handler.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "chrome/browser/printing/printer_manager_dialog.h"
+#include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/web_ui.h"
 
 namespace settings {
@@ -27,7 +28,8 @@
 void PrintingHandler::OnJavascriptDisallowed() {}
 
 void PrintingHandler::HandleOpenSystemPrintDialog(const base::ListValue* args) {
-  printing::PrinterManagerDialog::ShowPrinterManagerDialog();
+  printing::PrinterManagerDialog::ShowPrinterManagerDialog(
+      Profile::FromWebUI(web_ui()));
 }
 
 }  // namespace settings
diff --git a/chrome/common/safe_browsing/zip_analyzer.cc b/chrome/common/safe_browsing/zip_analyzer.cc
index 9353cca..1bf41d94f 100644
--- a/chrome/common/safe_browsing/zip_analyzer.cc
+++ b/chrome/common/safe_browsing/zip_analyzer.cc
@@ -14,6 +14,7 @@
 #include "base/macros.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/checked_math.h"
 #include "base/numerics/ranges.h"
 #include "base/rand_util.h"
 #include "base/time/time.h"
@@ -57,6 +58,7 @@
   bool advanced = true;
   results->file_count = 0;
   results->directory_count = 0;
+  base::CheckedNumeric<uint64_t> total_uncompressed_size = 0u;
   for (; reader.HasMore(); advanced = reader.AdvanceToNextEntry()) {
     if (!advanced) {
       DVLOG(1) << "Could not advance to next entry, aborting zip scan.";
@@ -82,12 +84,28 @@
         writer.file_length(), reader.current_entry_info()->is_encrypted(),
         results);
 
+    UMA_HISTOGRAM_MEMORY_LARGE_MB("SBClientDownload.ZipEntrySize",
+                                  writer.file_length());
+    total_uncompressed_size += writer.file_length();
+
     if (reader.current_entry_info()->is_directory())
       results->directory_count++;
     else
       results->file_count++;
   }
 
+  // We represent the size as a percent, so multiply by 100, then check for
+  // overflow.
+  total_uncompressed_size *= 100;
+  UMA_HISTOGRAM_BOOLEAN("SBClientDownload.ZipArchiveUncompressedSizeOverflow",
+                        !total_uncompressed_size.IsValid());
+  if (total_uncompressed_size.IsValid() && zip_file.GetLength() > 0) {
+    UMA_HISTOGRAM_COUNTS_10000(
+        "SBClientDownload.ZipCompressionRatio",
+        static_cast<uint64_t>(total_uncompressed_size.ValueOrDie()) /
+            zip_file.GetLength());
+  }
+
   results->success = !timeout;
 }
 
diff --git a/chrome/renderer/content_settings_observer_browsertest.cc b/chrome/renderer/content_settings_observer_browsertest.cc
index b41d3ba..5d8d3b2 100644
--- a/chrome/renderer/content_settings_observer_browsertest.cc
+++ b/chrome/renderer/content_settings_observer_browsertest.cc
@@ -29,14 +29,23 @@
 
 namespace {
 
-constexpr char kScriptHtml[] =
-    "<html>"
-    "<head>"
-    "<script src='data:foo'></script>"
-    "</head>"
-    "<body>"
-    "</body>"
-    "</html>";
+constexpr char kScriptHtml[] = R"HTML(
+  <html>
+  <head>
+    <script src='data:foo'></script>
+  </head>
+  <body></body>
+  </html>;
+)HTML";
+
+constexpr char kScriptWithSrcHtml[] = R"HTML(
+  <html>
+  <head>
+    <script src="http://www.example.com/script.js"></script>
+  </head>
+  <body></body>
+  </html>
+)HTML";
 
 class MockContentSettingsObserver : public ContentSettingsObserver {
  public:
@@ -115,6 +124,11 @@
 class ContentSettingsObserverBrowserTest : public ChromeRenderViewTest {
   void SetUp() override {
     ChromeRenderViewTest::SetUp();
+
+    // Set up a fake url loader factory to ensure that script loader can create
+    // a WebURLLoader.
+    CreateFakeWebURLLoaderFactory();
+
     // Unbind the ContentSettingsRenderer interface that would be registered by
     // the ContentSettingsObserver created when the render frame is created.
     view_->GetMainRenderFrame()
@@ -366,6 +380,29 @@
       ChromeViewHostMsg_ContentBlocked::ID));
 }
 
+TEST_F(ContentSettingsObserverBrowserTest, ContentSettingsAllowScriptsWithSrc) {
+  // Set the content settings for scripts.
+  RendererContentSettingRules content_setting_rules;
+  ContentSettingsForOneType& script_setting_rules =
+      content_setting_rules.script_rules;
+  script_setting_rules.push_back(ContentSettingPatternSource(
+      ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(),
+      base::Value::FromUniquePtrValue(
+          content_settings::ContentSettingToValue(CONTENT_SETTING_ALLOW)),
+      std::string(), false));
+
+  ContentSettingsObserver* observer =
+      ContentSettingsObserver::Get(view_->GetMainRenderFrame());
+  observer->SetContentSettingRules(&content_setting_rules);
+
+  // Load a page which contains a script.
+  LoadHTML(kScriptWithSrcHtml);
+
+  // Verify that the script was not blocked.
+  EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching(
+      ChromeViewHostMsg_ContentBlocked::ID));
+}
+
 // Regression test for crbug.com/232410: Load a page with JS blocked. Then,
 // allow JS and reload the page. In each case, only one of noscript or script
 // tags should be enabled, but never both.
diff --git a/chrome/services/cups_proxy/public/cpp/manifest.cc b/chrome/services/cups_proxy/public/cpp/manifest.cc
index 0e33cb3..d43aac8f 100644
--- a/chrome/services/cups_proxy/public/cpp/manifest.cc
+++ b/chrome/services/cups_proxy/public/cpp/manifest.cc
@@ -20,8 +20,7 @@
           .WithOptions(
               service_manager::ManifestOptionsBuilder()
                   .WithExecutionMode(service_manager::Manifest::ExecutionMode::
-                                         kOutOfProcessBuiltin)
-                  .WithSandboxType("utility")
+                                         kInProcessBuiltin)
                   .WithInstanceSharingPolicy(
                       service_manager::Manifest::InstanceSharingPolicy::
                           kSingleton)
diff --git a/chrome/services/media_gallery_util/OWNERS b/chrome/services/media_gallery_util/OWNERS
index 7ccf0e0..65216a6b 100644
--- a/chrome/services/media_gallery_util/OWNERS
+++ b/chrome/services/media_gallery_util/OWNERS
@@ -1 +1,2 @@
 file://chrome/browser/media_galleries/OWNERS
+# COMPONENT: Platform>Apps>MediaGalleries
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index e1ce9d8..5f0edfc 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1307,6 +1307,7 @@
       "origin_policy/origin_policy_browsertest.cc",
       "ppapi/ppapi_browsertest.cc",
       "ppapi/ppapi_filechooser_browsertest.cc",
+      "trustedtypes/trusted_types_browsertest.cc",
       "v8/wasm_trap_handler_browsertest.cc",
     ]
 
@@ -3530,6 +3531,7 @@
       "../browser/download/download_commands_unittest.cc",
       "../browser/download/download_shelf_unittest.cc",
       "../browser/enterprise_reporting/extension_info_unittest.cc",
+      "../browser/enterprise_reporting/policy_info_unittest.cc",
       "../browser/enterprise_reporting/profile_report_generator_unittest.cc",
       "../browser/enterprise_reporting/report_generator_unittest.cc",
       "../browser/enterprise_reporting/report_scheduler_unittest.cc",
@@ -3865,9 +3867,13 @@
       "../browser/media/webrtc/webrtc_rtp_dump_writer_unittest.cc",
       "../browser/policy/homepage_location_policy_handler_unittest.cc",
       "../browser/policy/local_sync_policy_handler_unittest.cc",
+      "../browser/renderer_context_menu/mock_render_view_context_menu.cc",
+      "../browser/renderer_context_menu/mock_render_view_context_menu.h",
       "../browser/renderer_context_menu/render_view_context_menu_test_util.cc",
       "../browser/renderer_context_menu/render_view_context_menu_test_util.h",
+      "../browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc",
       "../browser/sharing/click_to_call/click_to_call_sharing_dialog_controller_unittest.cc",
+      "../browser/sharing/click_to_call/click_to_call_utils_unittest.cc",
       "../browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc",
       "../browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc",
       "../browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc",
@@ -3954,8 +3960,6 @@
       "../browser/metrics/perf/process_type_collector_unittest.cc",
       "../browser/metrics/perf/profile_provider_chromeos_unittest.cc",
       "../browser/notifications/chrome_ash_message_center_client_unittest.cc",
-      "../browser/renderer_context_menu/mock_render_view_context_menu.cc",
-      "../browser/renderer_context_menu/mock_render_view_context_menu.h",
       "../browser/signin/signin_error_notifier_ash_unittest.cc",
       "../browser/speech/tts_chromeos_unittest.cc",
       "../browser/sync/sync_error_notifier_ash_unittest.cc",
diff --git a/chrome/test/chromedriver/client/chromedriver.py b/chrome/test/chromedriver/client/chromedriver.py
index 9e5342d..7d7f5a7 100644
--- a/chrome/test/chromedriver/client/chromedriver.py
+++ b/chrome/test/chromedriver/client/chromedriver.py
@@ -560,12 +560,6 @@
   def GetAvailableLogTypes(self):
     return self.ExecuteCommand(Command.GET_AVAILABLE_LOG_TYPES)
 
-  def IsAutoReporting(self):
-    return self.ExecuteCommand(Command.IS_AUTO_REPORTING)
-
-  def SetAutoReporting(self, enabled):
-    self.ExecuteCommand(Command.SET_AUTO_REPORTING, {'enabled': enabled})
-
   def SetNetworkConditions(self, latency, download_throughput,
                            upload_throughput, offline=False):
     # Until http://crbug.com/456324 is resolved, we'll always set 'offline' to
diff --git a/chrome/test/chromedriver/client/command_executor.py b/chrome/test/chromedriver/client/command_executor.py
index f3f49f3..c221d5b 100644
--- a/chrome/test/chromedriver/client/command_executor.py
+++ b/chrome/test/chromedriver/client/command_executor.py
@@ -160,8 +160,6 @@
   RELEASE_ACTIONS = (_Method.DELETE, '/session/:sessionId/actions')
   GET_LOG = (_Method.POST, '/session/:sessionId/se/log')
   GET_AVAILABLE_LOG_TYPES = (_Method.GET, '/session/:sessionId/se/log/types')
-  IS_AUTO_REPORTING = (_Method.GET, '/session/:sessionId/autoreport')
-  SET_AUTO_REPORTING = (_Method.POST, '/session/:sessionId/autoreport')
   GET_SESSION_LOGS = (_Method.POST, '/logs')
   STATUS = (_Method.GET, '/status')
   SET_NETWORK_CONNECTION = (
diff --git a/chrome/test/chromedriver/commands.cc b/chrome/test/chromedriver/commands.cc
index 9f87c95..0cc8bd8 100644
--- a/chrome/test/chromedriver/commands.cc
+++ b/chrome/test/chromedriver/commands.cc
@@ -314,11 +314,6 @@
         }
       }
 
-      if (status.IsOk() && session->auto_reporting_enabled) {
-        std::string message = session->GetFirstBrowserError();
-        if (!message.empty())
-          status = Status(kUnknownError, message);
-      }
     }
   }
 
diff --git a/chrome/test/chromedriver/log_replay/client_replay.py b/chrome/test/chromedriver/log_replay/client_replay.py
index 9471add..315eb06 100755
--- a/chrome/test/chromedriver/log_replay/client_replay.py
+++ b/chrome/test/chromedriver/log_replay/client_replay.py
@@ -155,7 +155,6 @@
     "HeapSnapshot": (Method.GET, "/session/:sessionId/chromium/heap_snapshot"),
     "InitSession": (Method.POST, "/session"),
     "IsAlertOpen": (Method.GET, "/session/:sessionId/alert"),
-    "IsAutoReporting": (Method.GET, "/session/:sessionId/autoreport"),
     "IsElementDisplayed":
     (Method.GET, "/session/:sessionId/element/:id/displayed"),
     "IsElementEnabled": (Method.GET, "/session/:sessionId/element/:id/enabled"),
@@ -185,7 +184,6 @@
     "SendCommandAndGetResult":
     (Method.POST, "/session/:sessionId/chromium/send_command_and_get_result"),
     "SetAlertPrompt": (Method.POST, "/session/:sessionId/alert_text"),
-    "SetAutoReporting": (Method.POST, "/session/:sessionId/autoreport"),
     "SetGeolocation": (Method.POST, "/session/:sessionId/location"),
     "SetImplicitWait":
     (Method.POST, "/session/:sessionId/timeouts/implicit_wait"),
diff --git a/chrome/test/chromedriver/server/http_handler.cc b/chrome/test/chromedriver/server/http_handler.cc
index 04e39d51..84fa79e 100644
--- a/chrome/test/chromedriver/server/http_handler.cc
+++ b/chrome/test/chromedriver/server/http_handler.cc
@@ -859,18 +859,6 @@
           kGet, "session/:sessionId/is_loading",
           WrapToCommand("IsLoading", base::BindRepeating(&ExecuteIsLoading))),
 
-      //
-      // Commands of unknown origins.
-      //
-
-      CommandMapping(
-          kGet, "session/:sessionId/autoreport",
-          WrapToCommand("IsAutoReporting",
-                        base::BindRepeating(&ExecuteIsAutoReporting))),
-      CommandMapping(
-          kPost, "session/:sessionId/autoreport",
-          WrapToCommand("SetAutoReporting",
-                        base::BindRepeating(&ExecuteSetAutoReporting))),
   };
   command_map_.reset(new CommandMap(commands, commands + base::size(commands)));
 }
diff --git a/chrome/test/chromedriver/session.cc b/chrome/test/chromedriver/session.cc
index 50463cb..21dd7e8 100644
--- a/chrome/test/chromedriver/session.cc
+++ b/chrome/test/chromedriver/session.cc
@@ -70,7 +70,6 @@
       implicit_wait(kDefaultImplicitWaitTimeout),
       page_load_timeout(kDefaultPageLoadTimeout),
       script_timeout(kDefaultScriptTimeout),
-      auto_reporting_enabled(false),
       strict_file_interactability(false),
       click_count(0),
       mouse_click_timestamp(base::TimeTicks::Now()) {}
@@ -87,7 +86,6 @@
       implicit_wait(kDefaultImplicitWaitTimeout),
       page_load_timeout(kDefaultPageLoadTimeout),
       script_timeout(kDefaultScriptTimeout),
-      auto_reporting_enabled(false),
       strict_file_interactability(false),
       click_count(0),
       mouse_click_timestamp(base::TimeTicks::Now()) {}
@@ -136,17 +134,6 @@
   return logs;
 }
 
-std::string Session::GetFirstBrowserError() const {
-  for (const auto& log : devtools_logs) {
-    if (log->type() == WebDriverLog::kBrowserType) {
-      std::string message = log->GetFirstErrorMessage();
-      if (!message.empty())
-        return message;
-    }
-  }
-  return std::string();
-}
-
 Session* GetThreadLocalSession() {
   return lazy_tls_session.Pointer()->Get();
 }
diff --git a/chrome/test/chromedriver/session.h b/chrome/test/chromedriver/session.h
index 90d9df9..5dcc2fb 100644
--- a/chrome/test/chromedriver/session.h
+++ b/chrome/test/chromedriver/session.h
@@ -80,7 +80,6 @@
                         const std::string& chromedriver_frame_id);
   std::string GetCurrentFrameId() const;
   std::vector<WebDriverLog*> GetAllLogs() const;
-  std::string GetFirstBrowserError() const;
 
   const std::string id;
   bool w3c_compliant;
@@ -119,7 +118,6 @@
   std::unique_ptr<WebDriverLog> driver_log;
   ScopedTempDirWithRetry temp_dir;
   std::unique_ptr<base::DictionaryValue> capabilities;
-  bool auto_reporting_enabled;
   // |command_listeners| should be declared after |chrome|. When the |Session|
   // is destroyed, |command_listeners| should be freed first, since some
   // |CommandListener|s might be |CommandListenerProxy|s that forward to
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index 86f8637..d9a26fe 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -1166,23 +1166,6 @@
   return Status(kOk);
 }
 
-Status ExecuteIsAutoReporting(Session* session,
-                              const base::DictionaryValue& params,
-                              std::unique_ptr<base::Value>* value) {
-  value->reset(new base::Value(session->auto_reporting_enabled));
-  return Status(kOk);
-}
-
-Status ExecuteSetAutoReporting(Session* session,
-                               const base::DictionaryValue& params,
-                               std::unique_ptr<base::Value>* value) {
-  bool enabled;
-  if (!params.GetBoolean("enabled", &enabled))
-    return Status(kInvalidArgument, "missing parameter 'enabled'");
-  session->auto_reporting_enabled = enabled;
-  return Status(kOk);
-}
-
 Status ExecuteUnimplementedCommand(Session* session,
                                    const base::DictionaryValue& params,
                                    std::unique_ptr<base::Value>* value) {
diff --git a/chrome/test/chromedriver/session_commands.h b/chrome/test/chromedriver/session_commands.h
index 2b457fb..f0bfc08 100644
--- a/chrome/test/chromedriver/session_commands.h
+++ b/chrome/test/chromedriver/session_commands.h
@@ -156,14 +156,6 @@
                          const base::DictionaryValue& params,
                          std::unique_ptr<base::Value>* value);
 
-Status ExecuteIsAutoReporting(Session* session,
-                              const base::DictionaryValue& params,
-                              std::unique_ptr<base::Value>* value);
-
-Status ExecuteSetAutoReporting(Session* session,
-                               const base::DictionaryValue& params,
-                               std::unique_ptr<base::Value>* value);
-
 Status ExecuteUnimplementedCommand(Session* session,
                                    const base::DictionaryValue& params,
                                    std::unique_ptr<base::Value>* value);
diff --git a/chrome/test/chromedriver/session_commands_unittest.cc b/chrome/test/chromedriver/session_commands_unittest.cc
index 8f0a9d6bb..ce189ca 100644
--- a/chrome/test/chromedriver/session_commands_unittest.cc
+++ b/chrome/test/chromedriver/session_commands_unittest.cc
@@ -422,47 +422,3 @@
   std::unique_ptr<base::Value> value;
   ASSERT_EQ(kUnknownError, ExecuteQuit(false, &session, params, &value).code());
 }
-
-TEST(SessionCommandsTest, AutoReporting) {
-  DetachChrome* chrome = new DetachChrome();
-  Session session("id", std::unique_ptr<Chrome>(chrome));
-  base::DictionaryValue params;
-  std::unique_ptr<base::Value> value;
-  StatusCode status_code;
-  bool enabled;
-
-  // autoreporting should be disabled by default
-  status_code = ExecuteIsAutoReporting(&session, params, &value).code();
-  ASSERT_EQ(kOk, status_code);
-  ASSERT_FALSE(session.auto_reporting_enabled);
-  ASSERT_TRUE(value.get()->GetAsBoolean(&enabled));
-  ASSERT_FALSE(enabled);
-
-  // an error should be given if the |enabled| parameter is not set
-  status_code = ExecuteSetAutoReporting(&session, params, &value).code();
-  ASSERT_EQ(kInvalidArgument, status_code);
-
-  // try to enable autoreporting
-  params.SetBoolean("enabled", true);
-  status_code = ExecuteSetAutoReporting(&session, params, &value).code();
-  ASSERT_EQ(kOk, status_code);
-  ASSERT_TRUE(session.auto_reporting_enabled);
-
-  // check that autoreporting was enabled successfully
-  status_code = ExecuteIsAutoReporting(&session, params, &value).code();
-  ASSERT_EQ(kOk, status_code);
-  ASSERT_TRUE(value.get()->GetAsBoolean(&enabled));
-  ASSERT_TRUE(enabled);
-
-  // try to disable autoreporting
-  params.SetBoolean("enabled", false);
-  status_code = ExecuteSetAutoReporting(&session, params, &value).code();
-  ASSERT_EQ(kOk, status_code);
-  ASSERT_FALSE(session.auto_reporting_enabled);
-
-  // check that autoreporting was disabled successfully
-  status_code = ExecuteIsAutoReporting(&session, params, &value).code();
-  ASSERT_EQ(kOk, status_code);
-  ASSERT_TRUE(value.get()->GetAsBoolean(&enabled));
-  ASSERT_FALSE(enabled);
-}
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 7e4f7da..52d8be7 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -1372,16 +1372,6 @@
     except Exception as e:
       self.fail(e.message)
 
-  def testAutoReporting(self):
-    self.assertFalse(self._driver.IsAutoReporting())
-    self._driver.SetAutoReporting(True)
-    self.assertTrue(self._driver.IsAutoReporting())
-    url = self.GetHttpUrlForFile('/chromedriver/console_log.html')
-    self.assertRaisesRegexp(
-        chromedriver.UnknownError,
-        ".*Uncaught TypeError: Cannot read property 'y' of undefined.*",
-        self._driver.Load, url)
-
   def testDoesntHangOnDebugger(self):
     self._driver.Load('about:blank')
     self._driver.ExecuteScript('debugger;')
diff --git a/chrome/test/data/local_ntp/local_ntp_browsertest.html b/chrome/test/data/local_ntp/local_ntp_browsertest.html
index 51bac02..86596be 100644
--- a/chrome/test/data/local_ntp/local_ntp_browsertest.html
+++ b/chrome/test/data/local_ntp/local_ntp_browsertest.html
@@ -216,7 +216,7 @@
             <div id="backgrounds-default-icon" class="bg-sel-tile"
                 tabindex="-1">
               <div class="mini-page">
-                <div class="mini-header"></div>
+                <div class="mini-header-colorful"></div>
                 <div class="mini-shortcuts"></div>
               </div>
             </div>
diff --git a/chrome/test/trustedtypes/trusted_types_browsertest.cc b/chrome/test/trustedtypes/trusted_types_browsertest.cc
new file mode 100644
index 0000000..0cf1672
--- /dev/null
+++ b/chrome/test/trustedtypes/trusted_types_browsertest.cc
@@ -0,0 +1,211 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/common/content_features.h"
+#include "net/http/http_status_code.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/test/embedded_test_server/http_request.h"
+#include "net/test/embedded_test_server/http_response.h"
+
+namespace {
+// Origin Trial tokens are bound to a specific origin (incl. port), so we need
+// to force our test server to run on the same port that the test token has
+// been generated for.
+const int kServerPort = 54321;
+
+// We (thankfully) cannot generate origin trial tokens with the production key
+// There is an origin trial 'test key' is documented of sorts, but does not
+// have a standard API.
+// Ref: docs/origin_trials_integration.md
+// Ref: src/third_party/blink/common/origin_trials/trial_token_unittest.cc
+constexpr char kOriginTrialTestPublicKey[] =
+    "dRCs+TocuKkocNKa0AtZ4awrt9XKH2SQCI6o4FY6BNA=";
+
+// Origin Trial Token for TrustedDOMTypes generated with:
+// $ tools/origin_trials/generate_token.py  \
+//     https://127.0.0.1:54321/  \
+//     "TrustedDOMTypes"  \
+//     --expire-timestamp=2000000000
+// (Token will expire ca. ~2033. See content/test/data/origin_trials/basic.html)
+constexpr char kOriginTrialToken[] =
+    "AnRnI2yGt1XQTaKUvbAQ8nRas1bXSDIWwfjeEaDKtXvHgid7wigd4IMm4DkBWsFWM+"
+    "Cww0rgYOpQpBWPBPN8xQwAAABZeyJvcmlnaW4iOiAiaHR0cHM6Ly8xMjcuMC4wLjE6NTQzMjEi"
+    "LCAiZmVhdHVyZSI6ICJUcnVzdGVkRE9NVHlwZXMiLCAiZXhwaXJ5IjogMjAwMDAwMDAwMH0=";
+constexpr char kTrustedTypesCSP[] = "trusted-types *";
+constexpr char kDefaultResponseTemplate[] = R"(
+<html>
+<head>
+  <title>(starting)</title>
+  META
+  <script id="target"></script>
+  <script>
+    const tt_available = window.TrustedTypes ? "enabled" : "disabled";
+    const target = document.getElementById("target");
+    let tt_enforced = "dont know yet";
+    try {
+      target.textContent = "2+2;";
+      tt_enforced = "ignored";
+    } catch (e) {
+      tt_enforced = "enforced";
+    }
+    document.title = `Trusted Types: ${tt_available} and ${tt_enforced}`;
+  </script>
+</head>
+<body>
+  <p>Hello World!</p>
+  <p>This test sets the document title.</p>
+</body>
+</html>
+)";
+
+// The expected test page titles when Trusted Types are disabled or enabled:
+constexpr char kTitleEnabled[] = "Trusted Types: enabled and enforced";
+constexpr char kTitleDisabled[] = "Trusted Types: disabled and ignored";
+constexpr char kTitleAvailable[] = "Trusted Types: enabled and ignored";
+
+// Generate a test response, based on kDefaultResponseTemplate.
+// If the request path contains:
+// - "otheader"/"otmeta": Put Origin Trial in header/<meta> element.
+//   (Use the token from kOriginTrialToken.)
+// - "cspheader"/"cspmeta": Put CSP into header/<meta> element.
+//   (Use the CSP from kTrustedTypesCSP.
+// Return 404 for all paths not ending in ".html".
+std::unique_ptr<net::test_server::HttpResponse> TrustedTypesTestHandler(
+    const net::test_server::HttpRequest& request) {
+  std::unique_ptr<net::test_server::BasicHttpResponse> response =
+      std::make_unique<net::test_server::BasicHttpResponse>();
+  std::string url = request.GetURL().spec();
+  if (!base::EndsWith(url, ".html", base::CompareCase::SENSITIVE)) {
+    response->set_code(net::HTTP_NOT_FOUND);
+    return response;
+  }
+
+  std::string meta;
+  if (url.find("otheader") != std::string::npos) {
+    response->AddCustomHeader("origin-trial", kOriginTrialToken);
+  } else if (url.find("otmeta") != std::string::npos) {
+    meta.append(std::string() + R"(<meta http-equiv="origin-trial" content=")" +
+                kOriginTrialToken + R"(">)");
+  }
+  if (url.find("cspheader") != std::string::npos) {
+    response->AddCustomHeader("Content-Security-Policy", kTrustedTypesCSP);
+  } else if (url.find("cspmeta") != std::string::npos) {
+    meta.append(std::string() +
+                R"(<meta http-equiv="Content-Security-Policy" content=")" +
+                kTrustedTypesCSP + R"(">)");
+  }
+
+  std::string contents = kDefaultResponseTemplate;
+  base::ReplaceFirstSubstringAfterOffset(&contents, 0, "META", meta);
+  response->set_content(contents);
+  response->set_content_type("text/html");
+  response->set_code(net::HTTP_OK);
+  return response;
+}
+
+}  // namespace
+
+// TrustedTypesBrowserTest tests activation of Trusted Types via CSP and Origin
+// Trial. (The tests for the actual TT functionality are found in
+// external/wpt/trusted-types/*.)
+class TrustedTypesBrowserTest : public InProcessBrowserTest {
+ public:
+  TrustedTypesBrowserTest() = default;
+  ~TrustedTypesBrowserTest() override = default;
+
+  void SetUpInProcessBrowserTestFixture() override {
+    server_ = std::make_unique<net::test_server::EmbeddedTestServer>(
+        net::test_server::EmbeddedTestServer::TYPE_HTTPS);
+    server_->RegisterRequestHandler(base::Bind(&TrustedTypesTestHandler));
+    EXPECT_TRUE(server()->Start(kServerPort));
+  }
+
+  void TearDownInProcessBrowserTestFixture() override { server_.reset(); }
+
+  net::test_server::EmbeddedTestServer* server() { return server_.get(); }
+
+  base::string16 NavigateToAndReturnTitle(const char* url) {
+    EXPECT_TRUE(server());
+    ui_test_utils::NavigateToURL(browser(), GURL(server()->GetURL(url)));
+    base::string16 title;
+    ui_test_utils::GetCurrentTabTitle(browser(), &title);
+    return title;
+  }
+
+  void SetUpDefaultCommandLine(base::CommandLine* command_line) override {
+    InProcessBrowserTest::SetUpDefaultCommandLine(command_line);
+    command_line->AppendSwitchASCII(switches::kOriginTrialPublicKey,
+                                    kOriginTrialTestPublicKey);
+  }
+
+  void SetUp() override {
+    // We need to explicitly disable the feature, so that our test cases can
+    // verify whether enabling it actually works.
+    feature_list_.InitAndDisableFeature(features::kTrustedDOMTypes);
+    InProcessBrowserTest::SetUp();
+  }
+
+ private:
+  std::unique_ptr<net::test_server::EmbeddedTestServer> server_;
+  base::test::ScopedFeatureList feature_list_;
+
+  DISALLOW_COPY_AND_ASSIGN(TrustedTypesBrowserTest);
+};
+
+// Our test cases are effectively a 3x3 matrix of origin trial token (absent|in
+// header|in <meta>) and content security policy (absent|in header|in <meta>).
+// The test fixture will generate the appropriate page based on the URL path.
+
+IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PagePlainX) {
+  EXPECT_EQ(base::ASCIIToUTF16(kTitleDisabled),
+            NavigateToAndReturnTitle("/page.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithTokenInHeader) {
+  EXPECT_EQ(base::ASCIIToUTF16(kTitleAvailable),
+            NavigateToAndReturnTitle("/page-otheader.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithTokenInMeta) {
+  EXPECT_EQ(base::ASCIIToUTF16(kTitleAvailable),
+            NavigateToAndReturnTitle("/page-otmeta.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithCSPInHeaderX) {
+  EXPECT_EQ(base::ASCIIToUTF16(kTitleDisabled),
+            NavigateToAndReturnTitle("/page-cspheader.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithCSPAndTokenInHeader) {
+  EXPECT_EQ(base::ASCIIToUTF16(kTitleEnabled),
+            NavigateToAndReturnTitle("/page-cspheader-otheader.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest,
+                       PageWithCSPInHeaderAndTokenInMeta) {
+  EXPECT_EQ(base::ASCIIToUTF16(kTitleEnabled),
+            NavigateToAndReturnTitle("/page-cspheader-otmeta.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithCSPInMetaX) {
+  EXPECT_EQ(base::ASCIIToUTF16(kTitleDisabled),
+            NavigateToAndReturnTitle("/page-cspmeta.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest,
+                       PageWithCSPInMetaAndTokenInHeader) {
+  EXPECT_EQ(base::ASCIIToUTF16(kTitleEnabled),
+            NavigateToAndReturnTitle("/page-cspmeta-otheader.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithCSPAndTokenInMeta) {
+  EXPECT_EQ(base::ASCIIToUTF16(kTitleEnabled),
+            NavigateToAndReturnTitle("/page-cspmeta-otmeta.html"));
+}
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc
index 37e0094..e7867040b 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -36,7 +36,6 @@
 #include "libassistant/shared/internal_api/assistant_manager_delegate.h"
 #include "libassistant/shared/internal_api/assistant_manager_internal.h"
 #include "libassistant/shared/public/media_manager.h"
-#include "mojo/public/mojom/base/time.mojom.h"
 #include "services/media_session/public/mojom/constants.mojom.h"
 #include "services/media_session/public/mojom/media_session.mojom.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -610,11 +609,6 @@
   notification_ptr->grouping_key = notification.grouping_key;
   notification_ptr->obfuscated_gaia_id = notification.obfuscated_gaia_id;
 
-  if (notification.expiry_timestamp_ms) {
-    notification_ptr->expiry_time =
-        base::Time::FromJavaTime(notification.expiry_timestamp_ms);
-  }
-
   // The server sometimes sends an empty |notification_id|, but our client
   // requires a non-empty |client_id| for notifications. Known instances in
   // which the server sends an empty |notification_id| are for Reminders.
diff --git a/chromeos/services/assistant/media_session/assistant_media_session.cc b/chromeos/services/assistant/media_session/assistant_media_session.cc
index 4559229..d90d2e8 100644
--- a/chromeos/services/assistant/media_session/assistant_media_session.cc
+++ b/chromeos/services/assistant/media_session/assistant_media_session.cc
@@ -60,10 +60,16 @@
 // TODO(b/135064564): Update StartDucking() and StopDucking() after volume
 // control API for media streams is implemented.
 void AssistantMediaSession::StartDucking() {
+  if (is_ducking_)
+    return;
+  is_ducking_ = true;
   Suspend(SuspendType::kSystem);
 }
 
 void AssistantMediaSession::StopDucking() {
+  if (!is_ducking_)
+    return;
+  is_ducking_ = false;
   Resume(SuspendType::kSystem);
 }
 
diff --git a/chromeos/services/assistant/media_session/assistant_media_session.h b/chromeos/services/assistant/media_session/assistant_media_session.h
index b1c0498a..e583901 100644
--- a/chromeos/services/assistant/media_session/assistant_media_session.h
+++ b/chromeos/services/assistant/media_session/assistant_media_session.h
@@ -114,6 +114,11 @@
   // Holds a pointer to the MediaSessionService.
   media_session::mojom::AudioFocusManagerPtr audio_focus_ptr_;
 
+  // The ducking state of this media session. The initial value is |false|, and
+  // is set to |true| after StartDucking(), and will be set to |false| after
+  // StopDucking().
+  bool is_ducking_ = false;
+
   // If the media session has acquired audio focus then this will contain a
   // pointer to that requests AudioFocusRequestClient.
   media_session::mojom::AudioFocusRequestClientPtr request_client_ptr_;
diff --git a/chromeos/services/assistant/public/features.cc b/chromeos/services/assistant/public/features.cc
index a3266510..c99d4bd 100644
--- a/chromeos/services/assistant/public/features.cc
+++ b/chromeos/services/assistant/public/features.cc
@@ -16,9 +16,6 @@
 const base::Feature kAssistantFeedbackUi{"AssistantFeedbackUi",
                                          base::FEATURE_ENABLED_BY_DEFAULT};
 
-const base::Feature kAssistantVoiceMatch{"AssistantVoiceMatch",
-                                         base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature kAssistantWarmerWelcomeFeature{
     "AssistantWarmerWelcome", base::FEATURE_ENABLED_BY_DEFAULT};
 
diff --git a/chromeos/services/assistant/public/features.h b/chromeos/services/assistant/public/features.h
index cc65645..5d9960b1 100644
--- a/chromeos/services/assistant/public/features.h
+++ b/chromeos/services/assistant/public/features.h
@@ -20,10 +20,6 @@
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 extern const base::Feature kAssistantFeedbackUi;
 
-// Enables Assistant voice match enrollment.
-COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
-extern const base::Feature kAssistantVoiceMatch;
-
 // Enables Assistant warmer welcome.
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 extern const base::Feature kAssistantWarmerWelcomeFeature;
diff --git a/chromeos/services/assistant/public/mojom/assistant.mojom b/chromeos/services/assistant/public/mojom/assistant.mojom
index adb929c..0b8d098a 100644
--- a/chromeos/services/assistant/public/mojom/assistant.mojom
+++ b/chromeos/services/assistant/public/mojom/assistant.mojom
@@ -295,10 +295,6 @@
 
   // Whether this notification can turn on the display if it was off.
   bool is_high_priority = false;
-
-  // When the notification should expire.
-  // Expressed as milliseconds since Unix Epoch.
-  mojo_base.mojom.Time? expiry_time;
 };
 
 // Models status of an app.
diff --git a/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc
index f978f1d..c1a0a53 100644
--- a/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc
+++ b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc
@@ -162,19 +162,24 @@
 
 base::string16 AutofillSaveCardInfoBarDelegateMobile::GetButtonLabel(
     InfoBarButton button) const {
-  if (button != BUTTON_OK && button != BUTTON_CANCEL) {
-    NOTREACHED() << "Unsupported button label requested.";
-    return base::string16();
+  if (button == BUTTON_OK) {
+    // Requesting name or expiration date from the user makes the save prompt a
+    // 2-step fix flow.
+    bool prompt_continue = options_.should_request_name_from_user ||
+                           options_.should_request_expiration_date_from_user;
+    return l10n_util::GetStringUTF16(
+        prompt_continue ? IDS_AUTOFILL_SAVE_CARD_PROMPT_CONTINUE
+                        : IDS_AUTOFILL_SAVE_CARD_INFOBAR_ACCEPT);
   }
+
   if (button == BUTTON_CANCEL) {
-    return l10n_util::GetStringUTF16(IDS_NO_THANKS);
+    return l10n_util::GetStringUTF16(
+        upload_ ? IDS_AUTOFILL_NO_THANKS_MOBILE_UPLOAD_SAVE
+                : IDS_AUTOFILL_NO_THANKS_MOBILE_LOCAL_SAVE);
   }
-  // Requesting name or expiration date from the user makes the save prompt a
-  // 2-step fix flow.
-  return options_.should_request_name_from_user ||
-                 options_.should_request_expiration_date_from_user
-             ? l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_PROMPT_CONTINUE)
-             : l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_INFOBAR_ACCEPT);
+
+  NOTREACHED() << "Unsupported button label requested.";
+  return base::string16();
 }
 
 bool AutofillSaveCardInfoBarDelegateMobile::Accept() {
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp
index 58ef6ab5..b50d29c 100644
--- a/components/autofill_payments_strings.grdp
+++ b/components/autofill_payments_strings.grdp
@@ -31,6 +31,25 @@
     </message>
   </if>
 
+  <if expr="is_android or is_ios">
+    <if expr="not use_titlecase">
+      <message name="IDS_AUTOFILL_NO_THANKS_MOBILE_LOCAL_SAVE" desc="The label for cancel button used in autofill credit card local save infobar on mobile.">
+        No thanks
+      </message>
+      <message name="IDS_AUTOFILL_NO_THANKS_MOBILE_UPLOAD_SAVE" desc="The label for cancel button used in autofill credit card upload save infobar on mobile.">
+        No thanks
+      </message>
+    </if>
+    <if expr="use_titlecase">
+      <message name="IDS_AUTOFILL_NO_THANKS_MOBILE_LOCAL_SAVE" desc="In Title Case: The label for cancel button used in autofill credit card local save infobar on mobile.">
+        No Thanks
+      </message>
+      <message name="IDS_AUTOFILL_NO_THANKS_MOBILE_UPLOAD_SAVE" desc="In Title Case: The label for cancel button used in autofill credit card upload save infobar on mobile.">
+        No Thanks
+      </message>
+    </if>
+  </if>
+
   <!-- Autofill Credit Card Assisted Filling Infobar -->
   <if expr="is_android">
     <message name="IDS_AUTOFILL_CREDIT_CARD_FILLING_INFOBAR_TITLE" desc="Title text for the Autofill Credit Card Assisted Filling Infobar">
diff --git a/components/crash_strings_grdp/OWNERS b/components/crash_strings_grdp/OWNERS
index 21fa106..05e3163 100644
--- a/components/crash_strings_grdp/OWNERS
+++ b/components/crash_strings_grdp/OWNERS
@@ -1 +1,2 @@
 file://components/crash/OWNERS
+# COMPONENT: Internals>CrashReporting
diff --git a/components/download/internal/common/download_file_impl.cc b/components/download/internal/common/download_file_impl.cc
index 45f6ea6..f0ebeb5 100644
--- a/components/download/internal/common/download_file_impl.cc
+++ b/components/download/internal/common/download_file_impl.cc
@@ -31,6 +31,7 @@
 #include "services/service_manager/public/cpp/connector.h"
 
 #if defined(OS_ANDROID)
+#include "base/android/content_uri_utils.h"
 #include "components/download/internal/common/android/download_collection_bridge.h"
 #endif  // defined(OS_ANDROID)
 
@@ -368,16 +369,21 @@
 }
 
 #if defined(OS_ANDROID)
-void DownloadFileImpl::CreateIntermediateUriForPublish(
+void DownloadFileImpl::RenameToIntermediateUri(
     const GURL& original_url,
     const GURL& referrer_url,
     const base::FilePath& file_name,
     const std::string& mime_type,
+    const base::FilePath& current_path,
     const RenameCompletionCallback& callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  // Create new content URI if |current_path| is not content URI
+  // or if it is already deleted.
   base::FilePath content_path =
-      DownloadCollectionBridge::CreateIntermediateUriForPublish(
-          original_url, referrer_url, file_name, mime_type);
+      current_path.IsContentUri() && base::ContentUriExists(current_path)
+          ? current_path
+          : DownloadCollectionBridge::CreateIntermediateUriForPublish(
+                original_url, referrer_url, file_name, mime_type);
   DownloadInterruptReason reason = DOWNLOAD_INTERRUPT_REASON_FILE_FAILED;
   if (!content_path.empty()) {
     reason = file_.Rename(content_path);
diff --git a/components/download/internal/common/download_item_impl.cc b/components/download/internal/common/download_item_impl.cc
index b3ee4ed..478d0c6 100644
--- a/components/download/internal/common/download_item_impl.cc
+++ b/components/download/internal/common/download_item_impl.cc
@@ -1640,15 +1640,17 @@
       base::Bind(&DownloadItemImpl::OnDownloadRenamedToIntermediateName,
                  weak_ptr_factory_.GetWeakPtr());
 #if defined(OS_ANDROID)
-  if (download_type_ == TYPE_ACTIVE_DOWNLOAD &&
-      DownloadCollectionBridge::ShouldPublishDownload(GetTargetFilePath())) {
+  if ((download_type_ == TYPE_ACTIVE_DOWNLOAD &&
+       DownloadCollectionBridge::ShouldPublishDownload(GetTargetFilePath())) ||
+      GetTargetFilePath().IsContentUri()) {
     GetDownloadTaskRunner()->PostTask(
         FROM_HERE,
-        base::BindOnce(&DownloadFile::CreateIntermediateUriForPublish,
+        base::BindOnce(&DownloadFile::RenameToIntermediateUri,
                        // Safe because we control download file lifetime.
                        base::Unretained(download_file_.get()), GetOriginalUrl(),
-                       GetReferrerUrl(), GetTargetFilePath().BaseName(),
-                       GetMimeType(), std::move(callback)));
+                       GetReferrerUrl(), GetFileNameToReportUser(),
+                       GetMimeType(), GetTargetFilePath(),
+                       std::move(callback)));
     return;
   }
 #endif  // defined(OS_ANDROID)
diff --git a/components/download/public/common/download_file.h b/components/download/public/common/download_file.h
index 98c5a1bd..6cfd902 100644
--- a/components/download/public/common/download_file.h
+++ b/components/download/public/common/download_file.h
@@ -119,13 +119,16 @@
   virtual void Resume() = 0;
 
 #if defined(OS_ANDROID)
-  // Create an intermediate URI to write the download file. Once completes,
-  // |callback| is called with a content URI to be written into.
-  virtual void CreateIntermediateUriForPublish(
+  // Renames the download file to an intermediate URI. If current_path is a
+  // content URI, it will be used for the renaming. Otherwise, A new
+  // intermediate URI will be created to write the download file. Once
+  // completes, |callback| is called with a content URI to be written into.
+  virtual void RenameToIntermediateUri(
       const GURL& original_url,
       const GURL& referrer_url,
       const base::FilePath& file_name,
       const std::string& mime_type,
+      const base::FilePath& current_path,
       const RenameCompletionCallback& callback) = 0;
 
   // Publishes the download to public. Once completes, |callback| is called with
diff --git a/components/download/public/common/download_file_impl.h b/components/download/public/common/download_file_impl.h
index df161412..1b33f39d 100644
--- a/components/download/public/common/download_file_impl.h
+++ b/components/download/public/common/download_file_impl.h
@@ -83,11 +83,12 @@
   void Resume() override;
 
 #if defined(OS_ANDROID)
-  void CreateIntermediateUriForPublish(
+  void RenameToIntermediateUri(
       const GURL& original_url,
       const GURL& referrer_url,
       const base::FilePath& file_name,
       const std::string& mime_type,
+      const base::FilePath& current_path,
       const RenameCompletionCallback& callback) override;
   void PublishDownload(const RenameCompletionCallback& callback) override;
   base::FilePath GetDisplayName() override;
diff --git a/components/download/public/common/mock_download_file.h b/components/download/public/common/mock_download_file.h
index 9c7df15e31..b0a7d25 100644
--- a/components/download/public/common/mock_download_file.h
+++ b/components/download/public/common/mock_download_file.h
@@ -70,11 +70,12 @@
   MOCK_METHOD0(Pause, void());
   MOCK_METHOD0(Resume, void());
 #if defined(OS_ANDROID)
-  MOCK_METHOD5(CreateIntermediateUriForPublish,
+  MOCK_METHOD6(RenameToIntermediateUri,
                void(const GURL& original_url,
                     const GURL& referrer_url,
                     const base::FilePath& file_name,
                     const std::string& mime_type,
+                    const base::FilePath& current_path,
                     const RenameCompletionCallback& callback));
   MOCK_METHOD1(PublishDownload, void(const RenameCompletionCallback& callback));
   MOCK_METHOD0(GetDisplayName, base::FilePath());
diff --git a/components/policy/OWNERS b/components/policy/OWNERS
index 6a7add43..83fca31 100644
--- a/components/policy/OWNERS
+++ b/components/policy/OWNERS
@@ -6,5 +6,6 @@
 pmarko@chromium.org
 poromov@chromium.org
 rsorokin@chromium.org
+zmin@chromium.org
 
 # COMPONENT: Enterprise
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index bc3ba27..2aabf089 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -1260,6 +1260,9 @@
 
   // The value of policy.
   optional string value = 5;
+
+  // The error message of policy.
+  optional string error = 6;
 }
 
 // Extension policy information.
@@ -1268,7 +1271,7 @@
   optional string extension_id = 1;
 
   // The list of policies that extension currently uses.
-  repeated Policy policy_reports = 2;
+  repeated Policy policies = 2;
 }
 
 // Cloud policy last fetch time.
diff --git a/components/printing/OWNERS b/components/printing/OWNERS
index 9b08c66..01ea38e 100644
--- a/components/printing/OWNERS
+++ b/components/printing/OWNERS
@@ -1 +1,2 @@
 file://printing/OWNERS
+# COMPONENT: Internals>Printing
diff --git a/components/printing/browser/OWNERS b/components/printing/browser/OWNERS
new file mode 100644
index 0000000..b1b8445d4
--- /dev/null
+++ b/components/printing/browser/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Internals>Printing
diff --git a/components/printing/common/OWNERS b/components/printing/common/OWNERS
index a7e6c89..c894089 100644
--- a/components/printing/common/OWNERS
+++ b/components/printing/common/OWNERS
@@ -6,3 +6,4 @@
 
 per-file *_param_traits*.*=set noparent
 per-file *_param_traits*.*=file://ipc/SECURITY_OWNERS
+# COMPONENT: Internals>Printing
diff --git a/components/printing_component_strings_grdp/OWNERS b/components/printing_component_strings_grdp/OWNERS
index 21ccd7b..4d633703 100644
--- a/components/printing_component_strings_grdp/OWNERS
+++ b/components/printing_component_strings_grdp/OWNERS
@@ -1 +1,2 @@
 file://components/printing/OWNERS
+# COMPONENT: Internals>Printing
diff --git a/components/remote_cocoa/common/BUILD.gn b/components/remote_cocoa/common/BUILD.gn
index 6d62fd12..f0a7ba3 100644
--- a/components/remote_cocoa/common/BUILD.gn
+++ b/components/remote_cocoa/common/BUILD.gn
@@ -21,7 +21,7 @@
     "//mojo/public/mojom/base",
     "//ui/base/accelerators/mojo:interfaces",
     "//ui/base/mojom",
-    "//ui/display/mojo:interfaces",
+    "//ui/display/mojom",
     "//ui/events/mojo:interfaces",
     "//ui/gfx/geometry/mojo",
     "//ui/gfx/mojo",
diff --git a/components/remote_cocoa/common/native_widget_ns_window_host.mojom b/components/remote_cocoa/common/native_widget_ns_window_host.mojom
index ea69b02c..f9925fc1 100644
--- a/components/remote_cocoa/common/native_widget_ns_window_host.mojom
+++ b/components/remote_cocoa/common/native_widget_ns_window_host.mojom
@@ -8,7 +8,7 @@
 import "ui/base/accelerators/mojo/accelerator.mojom";
 import "ui/base/mojom/ui_base_types.mojom";
 import "ui/base/mojom/window_open_disposition.mojom";
-import "ui/display/mojo/display.mojom";
+import "ui/display/mojom/display.mojom";
 import "ui/events/mojo/event.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
 import "ui/gfx/mojo/ca_layer_params.mojom";
diff --git a/components/renderer_context_menu/render_view_context_menu_base.cc b/components/renderer_context_menu/render_view_context_menu_base.cc
index 1a55873b..7dc7465 100644
--- a/components/renderer_context_menu/render_view_context_menu_base.cc
+++ b/components/renderer_context_menu/render_view_context_menu_base.cc
@@ -204,6 +204,13 @@
   menu_model_.AddItem(command_id, title);
 }
 
+void RenderViewContextMenuBase::AddMenuItemWithIcon(
+    int command_id,
+    const base::string16& title,
+    const gfx::ImageSkia& image) {
+  menu_model_.AddItemWithIcon(command_id, title, image);
+}
+
 void RenderViewContextMenuBase::AddCheckItem(int command_id,
                                          const base::string16& title) {
   menu_model_.AddCheckItem(command_id, title);
@@ -219,6 +226,15 @@
   menu_model_.AddSubMenu(command_id, label, model);
 }
 
+void RenderViewContextMenuBase::AddSubMenuWithStringIdAndIcon(
+    int command_id,
+    int message_id,
+    ui::MenuModel* model,
+    const gfx::ImageSkia& image) {
+  menu_model_.AddSubMenuWithStringIdAndIcon(command_id, message_id, model,
+                                            image);
+}
+
 void RenderViewContextMenuBase::UpdateMenuItem(int command_id,
                                            bool enabled,
                                            bool hidden,
diff --git a/components/renderer_context_menu/render_view_context_menu_base.h b/components/renderer_context_menu/render_view_context_menu_base.h
index 09ae71d5..7abdb03 100644
--- a/components/renderer_context_menu/render_view_context_menu_base.h
+++ b/components/renderer_context_menu/render_view_context_menu_base.h
@@ -95,11 +95,18 @@
 
   // RenderViewContextMenuProxy implementation.
   void AddMenuItem(int command_id, const base::string16& title) override;
+  void AddMenuItemWithIcon(int command_id,
+                           const base::string16& title,
+                           const gfx::ImageSkia& image) override;
   void AddCheckItem(int command_id, const base::string16& title) override;
   void AddSeparator() override;
   void AddSubMenu(int command_id,
                   const base::string16& label,
                   ui::MenuModel* model) override;
+  void AddSubMenuWithStringIdAndIcon(int command_id,
+                                     int message_id,
+                                     ui::MenuModel* model,
+                                     const gfx::ImageSkia& image) override;
   void UpdateMenuItem(int command_id,
                       bool enabled,
                       bool hidden,
diff --git a/components/renderer_context_menu/render_view_context_menu_proxy.h b/components/renderer_context_menu/render_view_context_menu_proxy.h
index f094fae..2f3d25b 100644
--- a/components/renderer_context_menu/render_view_context_menu_proxy.h
+++ b/components/renderer_context_menu/render_view_context_menu_proxy.h
@@ -15,6 +15,7 @@
 
 namespace gfx {
 class Image;
+class ImageSkia;
 }
 
 namespace ui {
@@ -80,6 +81,9 @@
  public:
   // Add a menu item to a context menu.
   virtual void AddMenuItem(int command_id, const base::string16& title) = 0;
+  virtual void AddMenuItemWithIcon(int command_id,
+                                   const base::string16& title,
+                                   const gfx::ImageSkia& image) = 0;
   virtual void AddCheckItem(int command_id, const base::string16& title) = 0;
   virtual void AddSeparator() = 0;
 
@@ -87,6 +91,10 @@
   virtual void AddSubMenu(int command_id,
                           const base::string16& label,
                           ui::MenuModel* model) = 0;
+  virtual void AddSubMenuWithStringIdAndIcon(int command_id,
+                                             int message_id,
+                                             ui::MenuModel* model,
+                                             const gfx::ImageSkia& image) = 0;
 
   // Update the status and text of the specified context-menu item.
   virtual void UpdateMenuItem(int command_id,
diff --git a/components/version_info/OWNERS b/components/version_info/OWNERS
index d33a4b7d..a4b70b7 100644
--- a/components/version_info/OWNERS
+++ b/components/version_info/OWNERS
@@ -2,3 +2,4 @@
 sky@chromium.org
 thakis@chromium.org
 thestig@chromium.org
+# COMPONENT: Internals
diff --git a/components/viz/service/display/renderer_perftest.cc b/components/viz/service/display/renderer_perftest.cc
index 50bbbb5..6588ea4 100644
--- a/components/viz/service/display/renderer_perftest.cc
+++ b/components/viz/service/display/renderer_perftest.cc
@@ -28,6 +28,7 @@
 #include "components/viz/service/display/display.h"
 #include "components/viz/service/display/gl_renderer.h"
 #include "components/viz/service/display/output_surface_client.h"
+#include "components/viz/service/display/skia_renderer.h"
 #include "components/viz/service/display_embedder/gl_output_surface_offscreen.h"
 #include "components/viz/service/display_embedder/in_process_gpu_memory_buffer_manager.h"
 #include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 866b6ea..2a5247a 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -511,8 +511,6 @@
     "background_sync/background_sync_metrics.h",
     "background_sync/background_sync_network_observer.cc",
     "background_sync/background_sync_network_observer.h",
-    "background_sync/background_sync_proxy.cc",
-    "background_sync/background_sync_proxy.h",
     "background_sync/background_sync_registration.cc",
     "background_sync/background_sync_registration.h",
     "background_sync/background_sync_registration_helper.cc",
diff --git a/content/browser/background_sync/background_sync_context_impl.cc b/content/browser/background_sync/background_sync_context_impl.cc
index 9d4de6a..51ef58d9 100644
--- a/content/browser/background_sync/background_sync_context_impl.cc
+++ b/content/browser/background_sync/background_sync_context_impl.cc
@@ -51,13 +51,12 @@
 
 // static
 void BackgroundSyncContext::GetSoonestWakeupDeltaAcrossPartitions(
-    blink::mojom::BackgroundSyncType sync_type,
     BrowserContext* browser_context,
     base::OnceCallback<void(base::TimeDelta)> callback) {
   DCHECK(browser_context);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  BackgroundSyncLauncher::GetSoonestWakeupDelta(sync_type, browser_context,
+  BackgroundSyncLauncher::GetSoonestWakeupDelta(browser_context,
                                                 std::move(callback));
 }
 
@@ -140,23 +139,18 @@
 }
 
 void BackgroundSyncContextImpl::GetSoonestWakeupDelta(
-    blink::mojom::BackgroundSyncType sync_type,
-    base::Time last_browser_wakeup_for_periodic_sync,
     base::OnceCallback<void(base::TimeDelta)> callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   base::PostTaskWithTraitsAndReplyWithResult(
       FROM_HERE, {BrowserThread::IO},
       base::BindOnce(
-          &BackgroundSyncContextImpl::GetSoonestWakeupDeltaOnIOThread, this,
-          sync_type, last_browser_wakeup_for_periodic_sync),
+          &BackgroundSyncContextImpl::GetSoonestWakeupDeltaOnIOThread, this),
       base::BindOnce(&BackgroundSyncContextImpl::DidGetSoonestWakeupDelta, this,
                      std::move(callback)));
 }
 
-base::TimeDelta BackgroundSyncContextImpl::GetSoonestWakeupDeltaOnIOThread(
-    blink::mojom::BackgroundSyncType sync_type,
-    base::Time last_browser_wakeup_for_periodic_sync) {
+base::TimeDelta BackgroundSyncContextImpl::GetSoonestWakeupDeltaOnIOThread() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   if (!test_wakeup_delta_.is_max())
@@ -164,8 +158,9 @@
   if (!background_sync_manager_)
     return base::TimeDelta::Max();
 
+  // TODO(crbug.com/925297): Add a wakeup task for PERIODIC_SYNC registrations.
   return background_sync_manager_->GetSoonestWakeupDelta(
-      sync_type, last_browser_wakeup_for_periodic_sync);
+      blink::mojom::BackgroundSyncType::ONE_SHOT);
 }
 
 void BackgroundSyncContextImpl::DidGetSoonestWakeupDelta(
diff --git a/content/browser/background_sync/background_sync_context_impl.h b/content/browser/background_sync/background_sync_context_impl.h
index ba54a87..a242fa35 100644
--- a/content/browser/background_sync/background_sync_context_impl.h
+++ b/content/browser/background_sync/background_sync_context_impl.h
@@ -71,8 +71,6 @@
   void FireBackgroundSyncEvents(blink::mojom::BackgroundSyncType sync_type,
                                 base::OnceClosure done_closure) override;
   void GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType sync_type,
-      base::Time last_browser_wakeup_for_periodic_sync,
       base::OnceCallback<void(base::TimeDelta)> callback) override;
 
  protected:
@@ -88,7 +86,6 @@
   friend class OneShotBackgroundSyncServiceImplTest;
   friend class PeriodicBackgroundSyncServiceImplTest;
   friend class BackgroundSyncLauncherTest;
-  friend class BackgroundSyncManagerTest;
 
   void FireBackgroundSyncEventsOnIOThread(
       blink::mojom::BackgroundSyncType sync_type,
@@ -107,9 +104,7 @@
 
   void ShutdownOnIO();
 
-  base::TimeDelta GetSoonestWakeupDeltaOnIOThread(
-      blink::mojom::BackgroundSyncType sync_type,
-      base::Time last_browser_wakeup_for_periodic_sync);
+  base::TimeDelta GetSoonestWakeupDeltaOnIOThread();
   void DidGetSoonestWakeupDelta(
       base::OnceCallback<void(base::TimeDelta)> callback,
       base::TimeDelta soonest_wakeup_delta);
diff --git a/content/browser/background_sync/background_sync_launcher.cc b/content/browser/background_sync/background_sync_launcher.cc
index 0f9c401..44074bb 100644
--- a/content/browser/background_sync/background_sync_launcher.cc
+++ b/content/browser/background_sync/background_sync_launcher.cc
@@ -59,13 +59,11 @@
 
 // static
 void BackgroundSyncLauncher::GetSoonestWakeupDelta(
-    blink::mojom::BackgroundSyncType sync_type,
     BrowserContext* browser_context,
     base::OnceCallback<void(base::TimeDelta)> callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  Get()->GetSoonestWakeupDeltaImpl(sync_type, browser_context,
-                                   std::move(callback));
+  Get()->GetSoonestWakeupDeltaImpl(browser_context, std::move(callback));
 }
 
 // static
@@ -77,17 +75,6 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(browser_context);
 
-  Get()->FireBackgroundSyncEventsImpl(browser_context, sync_type, j_runnable);
-}
-
-void BackgroundSyncLauncher::FireBackgroundSyncEventsImpl(
-    BrowserContext* browser_context,
-    blink::mojom::BackgroundSyncType sync_type,
-    const base::android::JavaParamRef<jobject>& j_runnable) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(browser_context);
-  if (sync_type == blink::mojom::BackgroundSyncType::PERIODIC)
-    last_browser_wakeup_for_periodic_sync_ = base::Time::Now();
   base::RepeatingClosure done_closure = base::BarrierClosure(
       GetStoragePartitionCount(browser_context),
       base::BindOnce(base::android::RunRunnableAndroid,
@@ -115,7 +102,6 @@
 BackgroundSyncLauncher::~BackgroundSyncLauncher() = default;
 
 void BackgroundSyncLauncher::GetSoonestWakeupDeltaImpl(
-    blink::mojom::BackgroundSyncType sync_type,
     BrowserContext* browser_context,
     base::OnceCallback<void(base::TimeDelta)> callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -130,11 +116,10 @@
       browser_context,
       base::BindRepeating(
           &BackgroundSyncLauncher::GetSoonestWakeupDeltaForStoragePartition,
-          base::Unretained(this), sync_type, std::move(done_closure)));
+          base::Unretained(this), std::move(done_closure)));
 }
 
 void BackgroundSyncLauncher::GetSoonestWakeupDeltaForStoragePartition(
-    blink::mojom::BackgroundSyncType sync_type,
     base::OnceClosure done_closure,
     StoragePartition* storage_partition) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -143,25 +128,20 @@
       storage_partition->GetBackgroundSyncContext();
   DCHECK(sync_context);
 
-  sync_context->GetSoonestWakeupDelta(
-      sync_type, last_browser_wakeup_for_periodic_sync_,
-      base::BindOnce(
-          [](base::OnceClosure done_closure,
-             base::TimeDelta* soonest_wakeup_delta,
-             base::TimeDelta wakeup_delta) {
-            DCHECK_CURRENTLY_ON(BrowserThread::UI);
-            *soonest_wakeup_delta =
-                std::min(*soonest_wakeup_delta, wakeup_delta);
-            std::move(done_closure).Run();
-          },
-          std::move(done_closure), &soonest_wakeup_delta_));
+  sync_context->GetSoonestWakeupDelta(base::BindOnce(
+      [](base::OnceClosure done_closure, base::TimeDelta* soonest_wakeup_delta,
+         base::TimeDelta wakeup_delta) {
+        DCHECK_CURRENTLY_ON(BrowserThread::UI);
+        *soonest_wakeup_delta = std::min(*soonest_wakeup_delta, wakeup_delta);
+        std::move(done_closure).Run();
+      },
+      std::move(done_closure), &soonest_wakeup_delta_));
 }
 
 void BackgroundSyncLauncher::SendSoonestWakeupDelta(
     base::OnceCallback<void(base::TimeDelta)> callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
   std::move(callback).Run(soonest_wakeup_delta_);
 }
 
-}  // namespace content
+}  // namespace content
\ No newline at end of file
diff --git a/content/browser/background_sync/background_sync_launcher.h b/content/browser/background_sync/background_sync_launcher.h
index 39c06ba..6bdb47a 100644
--- a/content/browser/background_sync/background_sync_launcher.h
+++ b/content/browser/background_sync/background_sync_launcher.h
@@ -27,7 +27,6 @@
  public:
   static BackgroundSyncLauncher* Get();
   static void GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType sync_type,
       BrowserContext* browser_context,
       base::OnceCallback<void(base::TimeDelta)> callback);
 #if defined(OS_ANDROID)
@@ -35,37 +34,26 @@
       BrowserContext* browser_context,
       blink::mojom::BackgroundSyncType sync_type,
       const base::android::JavaParamRef<jobject>& j_runnable);
-  base::TimeDelta TimeSinceLastBrowserWakeUpForPeriodicSync();
 #endif
 
  private:
   friend struct base::LazyInstanceTraitsBase<BackgroundSyncLauncher>;
   friend class BackgroundSyncLauncherTest;
-  friend class BackgroundSyncManagerTest;
 
   // Constructor and destructor marked private to enforce singleton.
   BackgroundSyncLauncher();
   ~BackgroundSyncLauncher();
 
   void GetSoonestWakeupDeltaImpl(
-      blink::mojom::BackgroundSyncType sync_type,
       BrowserContext* browser_context,
       base::OnceCallback<void(base::TimeDelta)> callback);
-#if defined(OS_ANDROID)
-  void FireBackgroundSyncEventsImpl(
-      BrowserContext* browser_context,
-      blink::mojom::BackgroundSyncType sync_type,
-      const base::android::JavaParamRef<jobject>& j_runnable);
-#endif
   void GetSoonestWakeupDeltaForStoragePartition(
-      blink::mojom::BackgroundSyncType sync_type,
       base::OnceClosure done_closure,
       StoragePartition* storage_partition);
   void SendSoonestWakeupDelta(
       base::OnceCallback<void(base::TimeDelta)> callback);
 
   base::TimeDelta soonest_wakeup_delta_ = base::TimeDelta::Max();
-  base::Time last_browser_wakeup_for_periodic_sync_;
   DISALLOW_COPY_AND_ASSIGN(BackgroundSyncLauncher);
 };
 
diff --git a/content/browser/background_sync/background_sync_launcher_unittest.cc b/content/browser/background_sync/background_sync_launcher_unittest.cc
index 60e4472..2d11ed1 100644
--- a/content/browser/background_sync/background_sync_launcher_unittest.cc
+++ b/content/browser/background_sync/background_sync_launcher_unittest.cc
@@ -90,11 +90,10 @@
 
   void TearDown() override { SetBrowserClientForTesting(original_client_); }
 
-  base::TimeDelta GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType sync_type) {
+  base::TimeDelta GetSoonestWakeupDelta() {
     base::TimeDelta to_return;
     BackgroundSyncLauncher::GetSoonestWakeupDelta(
-        sync_type, &test_browser_context_,
+        &test_browser_context_,
         base::BindLambdaForTesting(
             [&to_return](base::TimeDelta soonest_wakeup_delta) {
               to_return = soonest_wakeup_delta;
@@ -152,8 +151,7 @@
   // to base::TimeDelta::Max(). This will cause cancellation of the wakeup
   // task.
   SetUpBrowserContext(urls);
-  EXPECT_TRUE(GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::ONE_SHOT)
-                  .is_max());
+  EXPECT_TRUE(GetSoonestWakeupDelta().is_max());
 
   // Add two more storage partitions, this time with wakeup_deltas.
   // Verify that we pick the smaller of the two.
@@ -163,9 +161,7 @@
     wakeup_deltas[url] = delta_ms += 1000;
   SetUpBrowserContext(urls, wakeup_deltas);
 
-  EXPECT_EQ(GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::ONE_SHOT)
-                .InMilliseconds(),
-            1000);
+  EXPECT_EQ(GetSoonestWakeupDelta().InMilliseconds(), 1000);
 }
 
 #if defined(OS_ANDROID)
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc
index 01c4233..05c6a51 100644
--- a/content/browser/background_sync/background_sync_manager.cc
+++ b/content/browser/background_sync/background_sync_manager.cc
@@ -37,7 +37,6 @@
 
 #if defined(OS_ANDROID)
 #include "content/browser/android/background_sync_network_observer_android.h"
-#include "content/browser/background_sync/background_sync_launcher.h"
 #endif
 
 using blink::mojom::BackgroundSyncType;
@@ -177,6 +176,17 @@
       origin, status_code, num_attempts, max_attempts);
 }
 
+void RunInBackgroundOnUIThread(
+    scoped_refptr<ServiceWorkerContextWrapper> sw_context_wrapper) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  BackgroundSyncController* background_sync_controller =
+      GetBackgroundSyncControllerOnUIThread(sw_context_wrapper);
+  if (background_sync_controller) {
+    background_sync_controller->RunInBackground();
+  }
+}
+
 std::unique_ptr<BackgroundSyncParameters> GetControllerParameters(
     scoped_refptr<ServiceWorkerContextWrapper> sw_context_wrapper,
     std::unique_ptr<BackgroundSyncParameters> parameters) {
@@ -487,7 +497,6 @@
     : op_scheduler_(CacheStorageSchedulerClient::kBackgroundSync,
                     base::ThreadTaskRunnerHandle::Get()),
       service_worker_context_(std::move(service_worker_context)),
-      proxy_(service_worker_context_),
       devtools_context_(std::move(devtools_context)),
       parameters_(std::make_unique<BackgroundSyncParameters>()),
       disabled_(false),
@@ -495,7 +504,6 @@
       clock_(base::DefaultClock::GetInstance()) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(devtools_context_);
-  DCHECK(service_worker_context_);
 
   service_worker_context_->AddObserver(this);
 
@@ -855,7 +863,6 @@
   }
 
   BackgroundSyncMetrics::CountUnregisterPeriodicSync(BACKGROUND_SYNC_STATUS_OK);
-  ScheduleDelayedProcessingOfRegistrations(BackgroundSyncType::PERIODIC);
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::BindOnce(std::move(callback), BACKGROUND_SYNC_STATUS_OK));
@@ -1002,7 +1009,8 @@
       registration_could_fire,
       BackgroundSyncMetrics::REGISTRATION_IS_NOT_DUPLICATE);
 
-  ScheduleDelayedProcessingOfRegistrations(BackgroundSyncType::PERIODIC);
+  // TODO(crbug.com/925297): Schedule or update a wake up task for periodic
+  // Background Sync registrations.
 
   // Tell the client that the registration is ready. We won't fire it until the
   // client has resolved the registration event.
@@ -1181,35 +1189,12 @@
   // TODO(crbug.com/961238): Record Periodic Sync events for DevTools.
 }
 
-base::CancelableOnceClosure& BackgroundSyncManager::get_delayed_task(
-    BackgroundSyncType sync_type) {
-  if (sync_type == BackgroundSyncType::ONE_SHOT)
-    return delayed_one_shot_sync_task_;
-  return delayed_periodic_sync_task_;
-}
-
-void BackgroundSyncManager::ScheduleDelayedTask(BackgroundSyncType sync_type,
+void BackgroundSyncManager::ScheduleDelayedTask(base::OnceClosure callback,
                                                 base::TimeDelta delay) {
-  base::OnceClosure callback = get_delayed_task(sync_type).callback();
-
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, std::move(callback), delay);
 }
 
-void BackgroundSyncManager::ResetAndScheduleDelayedSyncTask(
-    BackgroundSyncType sync_type,
-    base::TimeDelta soonest_wakeup_delta) {
-  if (soonest_wakeup_delta.is_max() || soonest_wakeup_delta.is_zero())
-    return;
-
-  auto fire_events_callback = base::BindOnce(
-      &BackgroundSyncManager::FireReadyEvents, weak_ptr_factory_.GetWeakPtr(),
-      sync_type, MakeEmptyCompletion(), /* keepalive= */ nullptr);
-
-  get_delayed_task(sync_type).Reset(std::move(fire_events_callback));
-  ScheduleDelayedTask(sync_type, soonest_wakeup_delta);
-}
-
 void BackgroundSyncManager::HasMainFrameProviderHost(const url::Origin& origin,
                                                      BoolCallback callback) {
   service_worker_context_->HasMainFrameProviderHost(origin.GetURL(),
@@ -1279,11 +1264,9 @@
 }
 
 base::TimeDelta BackgroundSyncManager::GetSoonestWakeupDelta(
-    BackgroundSyncType sync_type,
-    base::Time last_browser_wakeup_time) {
+    BackgroundSyncType sync_type) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   base::TimeDelta soonest_wakeup_delta = base::TimeDelta::Max();
-  bool need_retries = false;
   for (const auto& sw_reg_id_and_registrations : active_registrations_) {
     for (const auto& key_and_registration :
          sw_reg_id_and_registrations.second.registration_map) {
@@ -1291,10 +1274,6 @@
           key_and_registration.second;
       if (registration.sync_type() != sync_type)
         continue;
-      if (registration.num_attempts() > 0 &&
-          registration.num_attempts() < registration.max_attempts()) {
-        need_retries = true;
-      }
       if (registration.sync_state() ==
           blink::mojom::BackgroundSyncState::PENDING) {
         if (clock_->Now() >= registration.delay_until()) {
@@ -1311,49 +1290,37 @@
 
   // If the browser is closed while firing events, the browser needs a task to
   // wake it back up and try again.
-  if (num_firing_registrations_ > 0 &&
+  if (sync_type == BackgroundSyncType::ONE_SHOT &&
+      num_firing_registrations_ > 0 &&
       soonest_wakeup_delta > parameters_->min_sync_recovery_time) {
     soonest_wakeup_delta = parameters_->min_sync_recovery_time;
   }
 
-  // The browser may impose a hard limit on how often it can be woken up to
-  // process periodic Background Sync registrations. This excludes retries.
-  if (sync_type == BackgroundSyncType::PERIODIC && !need_retries) {
-    soonest_wakeup_delta = MaybeApplyBrowserWakeupCountLimit(
-        soonest_wakeup_delta, last_browser_wakeup_time);
-  }
   return soonest_wakeup_delta;
 }
 
-base::TimeDelta BackgroundSyncManager::MaybeApplyBrowserWakeupCountLimit(
-    base::TimeDelta soonest_wakeup_delta,
-    base::Time last_browser_wakeup_time) {
+// TODO(crbug.com/925297): Update to also schedule a wakeup task for Periodic
+// Background Sync.
+void BackgroundSyncManager::RunInBackgroundIfNecessary() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (last_browser_wakeup_time.is_null())
-    return soonest_wakeup_delta;
 
-  base::TimeDelta time_since_last_browser_wakeup =
-      clock_->Now() - last_browser_wakeup_time;
-  if (time_since_last_browser_wakeup >=
-      parameters_->min_periodic_sync_events_interval) {
-    return soonest_wakeup_delta;
+  base::TimeDelta soonest_wakeup_delta =
+      GetSoonestWakeupDelta(BackgroundSyncType::ONE_SHOT);
+
+  // Try firing again after the wakeup delta.
+  if (!soonest_wakeup_delta.is_max() && !soonest_wakeup_delta.is_zero()) {
+    delayed_sync_task_.Reset(base::BindOnce(
+        &BackgroundSyncManager::FireReadyEvents, weak_ptr_factory_.GetWeakPtr(),
+        BackgroundSyncType::ONE_SHOT, MakeEmptyCompletion(),
+        /* keepalive= */ nullptr));
+    ScheduleDelayedTask(delayed_sync_task_.callback(), soonest_wakeup_delta);
   }
 
-  base::TimeDelta time_till_next_allowed_browser_wakeup =
-      parameters_->min_periodic_sync_events_interval -
-      time_since_last_browser_wakeup;
-  return std::max(soonest_wakeup_delta, time_till_next_allowed_browser_wakeup);
-}
-
-void BackgroundSyncManager::ScheduleDelayedProcessingOfRegistrations(
-    blink::mojom::BackgroundSyncType sync_type) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  ResetAndScheduleDelayedSyncTask(
-      sync_type,
-      GetSoonestWakeupDelta(sync_type,
-                            /* last_browser_wakeup_time= */ base::Time()));
-  proxy_.ScheduleBrowserWakeUp(sync_type);
+  // In case the browser closes (or to prevent it from closing), call
+  // RunInBackground to wake up the browser at the wakeup delta.
+  base::PostTaskWithTraits(
+      FROM_HERE, {BrowserThread::UI},
+      base::BindOnce(RunInBackgroundOnUIThread, service_worker_context_));
 }
 
 void BackgroundSyncManager::FireReadyEvents(
@@ -1411,7 +1378,7 @@
   }
 
   if (to_fire.empty()) {
-    ScheduleDelayedProcessingOfRegistrations(sync_type);
+    RunInBackgroundIfNecessary();
     base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
                                                   std::move(callback));
     return;
@@ -1424,8 +1391,7 @@
   base::RepeatingClosure events_fired_barrier_closure = base::BarrierClosure(
       to_fire.size(),
       base::BindOnce(&BackgroundSyncManager::FireReadyEventsAllEventsFiring,
-                     weak_ptr_factory_.GetWeakPtr(), sync_type,
-                     std::move(callback)));
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 
   // Record the total time taken after all events have run to completion.
   base::RepeatingClosure events_completed_barrier_closure =
@@ -1523,10 +1489,10 @@
 }
 
 void BackgroundSyncManager::FireReadyEventsAllEventsFiring(
-    BackgroundSyncType sync_type,
     base::OnceClosure callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  ScheduleDelayedProcessingOfRegistrations(sync_type);
+
+  RunInBackgroundIfNecessary();
   base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback));
 }
 
@@ -1727,8 +1693,10 @@
   }
 
   // Fire any ready events and call RunInBackground if anything is waiting.
+  // We don't need to do this for periodic Background Sync registrations, since
+  // once all events have been dispatched, we'll schedule a delayed task to
+  // (wake up Chrome and) fire the next set of periodicsync events.
   FireReadyEvents(BackgroundSyncType::ONE_SHOT, MakeEmptyCompletion());
-  FireReadyEvents(BackgroundSyncType::PERIODIC, MakeEmptyCompletion());
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback));
 }
diff --git a/content/browser/background_sync/background_sync_manager.h b/content/browser/background_sync/background_sync_manager.h
index 87c2819..c9beff4 100644
--- a/content/browser/background_sync/background_sync_manager.h
+++ b/content/browser/background_sync/background_sync_manager.h
@@ -21,7 +21,6 @@
 #include "base/time/clock.h"
 #include "base/time/time.h"
 #include "content/browser/background_sync/background_sync.pb.h"
-#include "content/browser/background_sync/background_sync_proxy.h"
 #include "content/browser/background_sync/background_sync_registration.h"
 #include "content/browser/background_sync/background_sync_status.h"
 #include "content/browser/cache_storage/cache_storage_scheduler.h"
@@ -148,23 +147,8 @@
   // Gets the soonest delta after which the browser should be woken up to send
   // a Background Sync event. If set to max, the browser won't be woken up.
   // Only registrations of type |sync_type| are considered.
-  // Browsers can have a hard limit on how often to wake themselves up to
-  // process Periodic Background Sync registrations. We apply this limit if
-  // |last_browser_wakeup_time| is not null.
-  // This limit is only applied when calculating the soonest wake up delta to
-  // wake up Chrome. It's not applied when calculating the time after which a
-  // delayed task should be run to process Background Sync registrations.
   virtual base::TimeDelta GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType sync_type,
-      base::Time last_browser_wakeup_time);
-
-  // Browsers can have a hard limit on how often to wake themselves up to
-  // process Periodic Background Sync registrations. If the browser can't be
-  // woken up after |wakeup_delta| to do so, returns an updated delta after
-  // which it's safe to wake the browser. This limit doesn't apply to retries.
-  base::TimeDelta MaybeApplyBrowserWakeupCountLimit(
-      base::TimeDelta wakeup_delta,
-      base::Time last_browser_wakeup_time);
+      blink::mojom::BackgroundSyncType sync_type);
 
  protected:
   BackgroundSyncManager(
@@ -193,7 +177,7 @@
       const std::string& tag,
       scoped_refptr<ServiceWorkerVersion> active_version,
       ServiceWorkerVersion::StatusCallback callback);
-  virtual void ScheduleDelayedTask(blink::mojom::BackgroundSyncType sync_type,
+  virtual void ScheduleDelayedTask(base::OnceClosure callback,
                                    base::TimeDelta delay);
   virtual void HasMainFrameProviderHost(const url::Origin& origin,
                                         BoolCallback callback);
@@ -316,21 +300,12 @@
   // Assumes that all registrations in the pending state are not currently ready
   // to fire. Therefore this should not be called directly and should only be
   // called by FireReadyEvents.
-  void ScheduleDelayedProcessingOfRegistrations(
-      blink::mojom::BackgroundSyncType sync_type);
-
-  base::CancelableOnceClosure& get_delayed_task(
-      blink::mojom::BackgroundSyncType sync_type);
-
-  void ResetAndScheduleDelayedSyncTask(
-      blink::mojom::BackgroundSyncType sync_type,
-      base::TimeDelta soonest_wakeup_delta);
+  void RunInBackgroundIfNecessary();
 
   void FireReadyEventsImpl(
       blink::mojom::BackgroundSyncType sync_type,
       base::OnceClosure callback,
       std::unique_ptr<BackgroundSyncEventKeepAlive> keepalive);
-
   void FireReadyEventsDidFindRegistration(
       blink::mojom::BackgroundSyncRegistrationInfoPtr registration_info,
       std::unique_ptr<BackgroundSyncEventKeepAlive> keepalive,
@@ -338,9 +313,7 @@
       base::OnceClosure event_completed_callback,
       blink::ServiceWorkerStatusCode service_worker_status,
       scoped_refptr<ServiceWorkerRegistration> service_worker_registration);
-  void FireReadyEventsAllEventsFiring(
-      blink::mojom::BackgroundSyncType sync_type,
-      base::OnceClosure callback);
+  void FireReadyEventsAllEventsFiring(base::OnceClosure callback);
 
   // Called when a sync event has completed.
   void EventComplete(
@@ -396,9 +369,8 @@
 
   CacheStorageScheduler op_scheduler_;
   scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_;
-  BackgroundSyncProxy proxy_;
-
   scoped_refptr<DevToolsBackgroundServicesContextImpl> devtools_context_;
+
   std::unique_ptr<BackgroundSyncParameters> parameters_;
 
   // True if the manager is disabled and registrations should fail.
@@ -407,8 +379,7 @@
   // The number of registrations currently in the firing state.
   int num_firing_registrations_;
 
-  base::CancelableOnceClosure delayed_one_shot_sync_task_;
-  base::CancelableOnceClosure delayed_periodic_sync_task_;
+  base::CancelableOnceClosure delayed_sync_task_;
 
   std::unique_ptr<BackgroundSyncNetworkObserver> network_observer_;
 
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc
index ff1f498..c35e11c 100644
--- a/content/browser/background_sync/background_sync_manager_unittest.cc
+++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -23,8 +23,6 @@
 #include "base/test/mock_entropy_provider.h"
 #include "base/test/simple_test_clock.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "build/build_config.h"
-#include "content/browser/background_sync/background_sync_launcher.h"
 #include "content/browser/background_sync/background_sync_network_observer.h"
 #include "content/browser/background_sync/background_sync_status.h"
 #include "content/browser/devtools/devtools_background_services_context_impl.h"
@@ -42,7 +40,6 @@
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_utils.h"
 #include "content/test/mock_background_sync_controller.h"
-#include "content/test/test_background_sync_context.h"
 #include "content/test/test_background_sync_manager.h"
 #include "services/network/test/test_network_connection_tracker.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -132,10 +129,11 @@
 
     // Create a StoragePartition with the correct BrowserContext so that the
     // BackgroundSyncManager can find the BrowserContext through it.
-    storage_partition_impl_ = static_cast<StoragePartitionImpl*>(
-        BrowserContext::GetStoragePartitionForSite(
-            helper_->browser_context(), GURL("https://example.com")));
-    helper_->context_wrapper()->set_storage_partition(storage_partition_impl_);
+    storage_partition_impl_ = StoragePartitionImpl::Create(
+        helper_->browser_context(), /* in_memory= */ true, base::FilePath(),
+        /* partition_domain= */ "");
+    helper_->context_wrapper()->set_storage_partition(
+        storage_partition_impl_.get());
 
     SetMaxSyncAttemptsAndRestartManager(1);
 
@@ -153,7 +151,6 @@
         ->RemoveObserver(this);
     // Restore the network observer functionality for subsequent tests.
     background_sync_test_util::SetIgnoreNetworkChanges(false);
-    background_sync_context_->Shutdown();
   }
 
   void RegisterServiceWorkers() {
@@ -195,9 +192,9 @@
   void SetNetwork(network::mojom::ConnectionType connection_type) {
     network::TestNetworkConnectionTracker::GetInstance()->SetConnectionType(
         connection_type);
-    if (test_background_sync_manager()) {
+    if (test_background_sync_manager_) {
       BackgroundSyncNetworkObserver* network_observer =
-          test_background_sync_manager()->GetNetworkObserverForTesting();
+          test_background_sync_manager_->GetNetworkObserverForTesting();
       network_observer->NotifyManagerIfConnectionChangedForTesting(
           connection_type);
       base::RunLoop().RunUntilIdle();
@@ -245,16 +242,9 @@
     callback_status_ = status;
   }
 
-  TestBackgroundSyncManager* test_background_sync_manager() {
-    return static_cast<TestBackgroundSyncManager*>(
-        background_sync_context_->background_sync_manager());
-  }
-
   base::TimeDelta GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType sync_type,
-      base::Time last_browser_wakeup_for_periodic_sync) {
-    return test_background_sync_manager()->GetSoonestWakeupDelta(
-        sync_type, last_browser_wakeup_for_periodic_sync);
+      blink::mojom::BackgroundSyncType sync_type) {
+    return test_background_sync_manager_->GetSoonestWakeupDelta(sync_type);
   }
 
  protected:
@@ -264,24 +254,11 @@
                void(bool, devtools::proto::BackgroundService));
 
   void CreateBackgroundSyncManager() {
-    if (background_sync_context_) {
-      background_sync_context_->Shutdown();
-      base::RunLoop().RunUntilIdle();
-    }
-
-    background_sync_context_ =
-        base::MakeRefCounted<TestBackgroundSyncContext>();
-    background_sync_context_->Init(
+    test_background_sync_manager_ = std::make_unique<TestBackgroundSyncManager>(
         helper_->context_wrapper(),
         storage_partition_impl_->GetDevToolsBackgroundServicesContext());
-    base::RunLoop().RunUntilIdle();
 
-    storage_partition_impl_->ShutdownBackgroundSyncContextForTesting();
-    base::RunLoop().RunUntilIdle();
-    storage_partition_impl_->OverrideBackgroundSyncContextForTesting(
-        background_sync_context_.get());
-
-    test_background_sync_manager()->set_clock(&test_clock_);
+    test_background_sync_manager_->set_clock(&test_clock_);
 
     // Many tests do not expect the sync event to fire immediately after
     // register (and cleanup up the sync registrations).  Tests can control when
@@ -292,7 +269,7 @@
   }
 
   void InitBackgroundSyncManager() {
-    test_background_sync_manager()->DoInit();
+    test_background_sync_manager_->DoInit();
     base::RunLoop().RunUntilIdle();
   }
 
@@ -303,19 +280,18 @@
 
   void SetupCorruptBackgroundSyncManager() {
     CreateBackgroundSyncManager();
-    test_background_sync_manager()->set_corrupt_backend(true);
+    test_background_sync_manager_->set_corrupt_backend(true);
     InitBackgroundSyncManager();
   }
 
   void SetupDelayedBackgroundSyncManager() {
     CreateBackgroundSyncManager();
-    test_background_sync_manager()->set_delay_backend(true);
+    test_background_sync_manager_->set_delay_backend(true);
     InitBackgroundSyncManager();
   }
 
   void DeleteBackgroundSyncManager() {
-    storage_partition_impl_->GetBackgroundSyncContext()
-        ->set_background_sync_manager_for_testing(nullptr);
+    test_background_sync_manager_ = nullptr;
   }
 
   bool Register(blink::mojom::SyncRegistrationOptions sync_options) {
@@ -335,14 +311,14 @@
     BackgroundSyncStatus* callback_status;
     if (GetBackgroundSyncType(options) ==
         blink::mojom::BackgroundSyncType::ONE_SHOT) {
-      test_background_sync_manager()->Register(
+      test_background_sync_manager_->Register(
           sw_registration_id, std::move(options),
           base::BindOnce(&BackgroundSyncManagerTest::
                              StatusAndOneShotSyncRegistrationCallback,
                          base::Unretained(this), &was_called));
       callback_status = &one_shot_sync_callback_status_;
     } else {
-      test_background_sync_manager()->Register(
+      test_background_sync_manager_->Register(
           sw_registration_id, std::move(options),
           base::BindOnce(&BackgroundSyncManagerTest::
                              StatusAndPeriodicSyncRegistrationCallback,
@@ -356,7 +332,7 @@
     // Mock the client receiving the response and calling
     // DidResolveRegistration.
     if (*callback_status == BACKGROUND_SYNC_STATUS_OK) {
-      test_background_sync_manager()->DidResolveRegistration(
+      test_background_sync_manager_->DidResolveRegistration(
           blink::mojom::BackgroundSyncRegistrationInfo::New(
               sw_registration_id, options.tag, GetBackgroundSyncType(options)));
       base::RunLoop().RunUntilIdle();
@@ -375,7 +351,7 @@
     }
 
     bool was_called = false;
-    test_background_sync_manager()->UnregisterPeriodicSync(
+    test_background_sync_manager_->UnregisterPeriodicSync(
         sw_registration_id, options.tag,
         base::BindOnce(&BackgroundSyncManagerTest::StatusCallback,
                        base::Unretained(this), &was_called));
@@ -406,7 +382,7 @@
       blink::mojom::SyncRegistrationOptions registration_options) {
     bool was_called = false;
 
-    test_background_sync_manager()->GetOneShotSyncRegistrations(
+    test_background_sync_manager_->GetOneShotSyncRegistrations(
         sw_registration_id,
         base::BindOnce(&BackgroundSyncManagerTest::
                            StatusAndOneShotSyncRegistrationsCallback,
@@ -438,7 +414,7 @@
       blink::mojom::SyncRegistrationOptions registration_options) {
     bool was_called = false;
 
-    test_background_sync_manager()->GetPeriodicSyncRegistrations(
+    test_background_sync_manager_->GetPeriodicSyncRegistrations(
         sw_registration_id,
         base::BindOnce(&BackgroundSyncManagerTest::
                            StatusAndPeriodicSyncRegistrationsCallback,
@@ -467,7 +443,7 @@
 
   bool GetOneShotSyncRegistrations() {
     bool was_called = false;
-    test_background_sync_manager()->GetOneShotSyncRegistrations(
+    test_background_sync_manager_->GetOneShotSyncRegistrations(
         sw_registration_id_1_,
         base::BindOnce(&BackgroundSyncManagerTest::
                            StatusAndOneShotSyncRegistrationsCallback,
@@ -480,7 +456,7 @@
 
   bool GetPeriodicSyncRegistrations() {
     bool was_called = false;
-    test_background_sync_manager()->GetPeriodicSyncRegistrations(
+    test_background_sync_manager_->GetPeriodicSyncRegistrations(
         sw_registration_id_1_,
         base::BindOnce(&BackgroundSyncManagerTest::
                            StatusAndPeriodicSyncRegistrationsCallback,
@@ -517,13 +493,13 @@
 
   void SetupForSyncEvent(
       const TestBackgroundSyncManager::DispatchSyncCallback& callback) {
-    test_background_sync_manager()->set_dispatch_sync_callback(callback);
+    test_background_sync_manager_->set_dispatch_sync_callback(callback);
     SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI);
   }
 
   void SetupForPeriodicSyncEvent(
       const TestBackgroundSyncManager::DispatchSyncCallback& callback) {
-    test_background_sync_manager()->set_dispatch_periodic_sync_callback(
+    test_background_sync_manager_->set_dispatch_periodic_sync_callback(
         callback);
     SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI);
   }
@@ -570,25 +546,12 @@
     sync_fired_callback_ = std::move(callback);
   }
 
-  void DispatchPeriodicSyncDelayedCallback(
-      scoped_refptr<ServiceWorkerVersion> active_version,
-      ServiceWorkerVersion::StatusCallback callback) {
-    periodic_sync_events_called_++;
-    periodic_sync_fired_callback_ = std::move(callback);
-  }
-
   void InitDelayedSyncEventTest() {
     SetupForSyncEvent(base::BindRepeating(
         &BackgroundSyncManagerTest::DispatchSyncDelayedCallback,
         base::Unretained(this)));
   }
 
-  void InitDelayedPeriodicSyncEventTest() {
-    SetupForPeriodicSyncEvent(base::BindRepeating(
-        &BackgroundSyncManagerTest::DispatchPeriodicSyncDelayedCallback,
-        base::Unretained(this)));
-  }
-
   void RegisterAndVerifySyncEventDelayed(
       blink::mojom::SyncRegistrationOptions sync_options) {
     int count_sync_events = sync_events_called_;
@@ -619,27 +582,17 @@
     SetupBackgroundSyncManager();
   }
 
-  void SetPeriodicSyncEventsMinIntervalAndRestartManager(
-      base::TimeDelta periodic_sync_events_min_interval) {
-    BackgroundSyncParameters* parameters =
-        GetController()->background_sync_parameters();
-    parameters->min_periodic_sync_events_interval =
-        periodic_sync_events_min_interval;
-
-    // Restart the BackgroundSyncManager so that it updates its parameters.
-    SetupBackgroundSyncManager();
-  }
-
-  void FireReadyEvents() { test_background_sync_manager()->OnNetworkChanged(); }
+  void FireReadyEvents() { test_background_sync_manager_->OnNetworkChanged(); }
 
   bool AreOptionConditionsMet() {
-    return test_background_sync_manager()->AreOptionConditionsMet();
+    return test_background_sync_manager_->AreOptionConditionsMet();
   }
 
   TestBrowserThreadBundle browser_thread_bundle_;
   std::unique_ptr<EmbeddedWorkerTestHelper> helper_;
-  StoragePartitionImpl* storage_partition_impl_;
-  scoped_refptr<BackgroundSyncContextImpl> background_sync_context_;
+  std::unique_ptr<StoragePartitionImpl> storage_partition_impl_;
+  std::unique_ptr<TestBackgroundSyncManager> test_background_sync_manager_ =
+      nullptr;
   base::SimpleTestClock test_clock_;
 
   int64_t sw_registration_id_1_;
@@ -669,7 +622,6 @@
   int sync_events_called_ = 0;
   int periodic_sync_events_called_ = 0;
   ServiceWorkerVersion::StatusCallback sync_fired_callback_;
-  ServiceWorkerVersion::StatusCallback periodic_sync_fired_callback_;
 };
 
 TEST_F(BackgroundSyncManagerTest, Register) {
@@ -695,7 +647,7 @@
   EXPECT_TRUE(GetRegistration(sync_options_2_));
 
   // Disable manager. Unregister should fail.
-  test_background_sync_manager()->set_corrupt_backend(true);
+  test_background_sync_manager_->set_corrupt_backend(true);
   EXPECT_FALSE(Unregister(sync_options_2_));
   SetupBackgroundSyncManager();
   EXPECT_TRUE(Unregister(sync_options_2_));
@@ -728,7 +680,7 @@
 TEST_F(BackgroundSyncManagerTest, RegisterAndWaitToFireUntilResolved) {
   InitSyncEventTest();
   bool was_called = false;
-  test_background_sync_manager()->Register(
+  test_background_sync_manager_->Register(
       sw_registration_id_1_, sync_options_1_,
       base::BindOnce(
           &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback,
@@ -740,7 +692,7 @@
   // client to acknowledge with DidResolveRegistration.
   EXPECT_EQ(0, sync_events_called_);
 
-  test_background_sync_manager()->DidResolveRegistration(
+  test_background_sync_manager_->DidResolveRegistration(
       blink::mojom::BackgroundSyncRegistrationInfo::New(
           sw_registration_id_1_, sync_options_1_.tag,
           GetBackgroundSyncType(sync_options_1_)));
@@ -751,7 +703,7 @@
 TEST_F(BackgroundSyncManagerTest, ResolveInvalidRegistration) {
   InitSyncEventTest();
   bool was_called = false;
-  test_background_sync_manager()->Register(
+  test_background_sync_manager_->Register(
       sw_registration_id_1_, sync_options_1_,
       base::BindOnce(
           &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback,
@@ -764,7 +716,7 @@
   EXPECT_EQ(0, sync_events_called_);
 
   // Resolve a non-existing registration.
-  test_background_sync_manager()->DidResolveRegistration(
+  test_background_sync_manager_->DidResolveRegistration(
       blink::mojom::BackgroundSyncRegistrationInfo::New(
           sw_registration_id_1_, "unknown_tag",
           GetBackgroundSyncType(sync_options_1_)));
@@ -811,9 +763,9 @@
 }
 
 TEST_F(BackgroundSyncManagerTest, RegisterBadBackend) {
-  test_background_sync_manager()->set_corrupt_backend(true);
+  test_background_sync_manager_->set_corrupt_backend(true);
   EXPECT_FALSE(Register(sync_options_1_));
-  test_background_sync_manager()->set_corrupt_backend(false);
+  test_background_sync_manager_->set_corrupt_backend(false);
   EXPECT_FALSE(Register(sync_options_1_));
   EXPECT_FALSE(GetRegistration(sync_options_1_));
 }
@@ -883,13 +835,13 @@
 
 TEST_F(BackgroundSyncManagerTest, GetRegistrationBadBackend) {
   EXPECT_TRUE(Register(sync_options_1_));
-  test_background_sync_manager()->set_corrupt_backend(true);
+  test_background_sync_manager_->set_corrupt_backend(true);
   EXPECT_TRUE(GetRegistration(sync_options_1_));
   EXPECT_FALSE(Register(sync_options_2_));
   // Registration should have discovered the bad backend and disabled the
   // BackgroundSyncManager.
   EXPECT_FALSE(GetRegistration(sync_options_1_));
-  test_background_sync_manager()->set_corrupt_backend(false);
+  test_background_sync_manager_->set_corrupt_backend(false);
   EXPECT_FALSE(GetRegistration(sync_options_1_));
 }
 
@@ -935,13 +887,13 @@
 
 TEST_F(BackgroundSyncManagerTest, GetRegistrationsBadBackend) {
   EXPECT_TRUE(Register(sync_options_1_));
-  test_background_sync_manager()->set_corrupt_backend(true);
+  test_background_sync_manager_->set_corrupt_backend(true);
   EXPECT_TRUE(GetOneShotSyncRegistrations());
   EXPECT_FALSE(Register(sync_options_2_));
   // Registration should have discovered the bad backend and disabled the
   // BackgroundSyncManager.
   EXPECT_FALSE(GetOneShotSyncRegistrations());
-  test_background_sync_manager()->set_corrupt_backend(false);
+  test_background_sync_manager_->set_corrupt_backend(false);
   EXPECT_FALSE(GetOneShotSyncRegistrations());
 }
 
@@ -1031,12 +983,12 @@
 
   bool register_called = false;
   bool get_registrations_called = false;
-  test_background_sync_manager()->Register(
+  test_background_sync_manager_->Register(
       sw_registration_id_1_, sync_options_1_,
       base::BindOnce(
           &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback,
           base::Unretained(this), &register_called));
-  test_background_sync_manager()->GetOneShotSyncRegistrations(
+  test_background_sync_manager_->GetOneShotSyncRegistrations(
       sw_registration_id_1_,
       base::BindOnce(
           &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationsCallback,
@@ -1047,13 +999,13 @@
   EXPECT_FALSE(register_called);
   EXPECT_FALSE(get_registrations_called);
 
-  test_background_sync_manager()->ResumeBackendOperation();
+  test_background_sync_manager_->ResumeBackendOperation();
   base::RunLoop().RunUntilIdle();
   // Register should be blocked while storing to the backend.
   EXPECT_FALSE(register_called);
   EXPECT_FALSE(get_registrations_called);
 
-  test_background_sync_manager()->ResumeBackendOperation();
+  test_background_sync_manager_->ResumeBackendOperation();
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(register_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, one_shot_sync_callback_status_);
@@ -1072,9 +1024,9 @@
   EXPECT_TRUE(Register(sync_options_1_));
   sync_options_2_.min_interval = 3600;
 
-  test_background_sync_manager()->set_delay_backend(true);
+  test_background_sync_manager_->set_delay_backend(true);
   bool callback_called = false;
-  test_background_sync_manager()->Register(
+  test_background_sync_manager_->Register(
       sw_registration_id_1_, sync_options_2_,
       base::BindOnce(
           &BackgroundSyncManagerTest::StatusAndPeriodicSyncRegistrationCallback,
@@ -1084,13 +1036,13 @@
   EXPECT_FALSE(callback_called);
   UnregisterServiceWorker(sw_registration_id_1_);
 
-  test_background_sync_manager()->ResumeBackendOperation();
+  test_background_sync_manager_->ResumeBackendOperation();
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(callback_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_STORAGE_ERROR,
             periodic_sync_callback_status_);
 
-  test_background_sync_manager()->set_delay_backend(false);
+  test_background_sync_manager_->set_delay_backend(false);
   EXPECT_FALSE(GetRegistration(sync_options_1_));
 }
 
@@ -1102,12 +1054,12 @@
 
 TEST_F(BackgroundSyncManagerTest, DisabledManagerWorksAfterBrowserRestart) {
   EXPECT_TRUE(Register(sync_options_1_));
-  test_background_sync_manager()->set_corrupt_backend(true);
+  test_background_sync_manager_->set_corrupt_backend(true);
   EXPECT_FALSE(Register(sync_options_2_));
 
   // The manager is now disabled and not accepting new requests until browser
   // restart or notification that the storage has been wiped.
-  test_background_sync_manager()->set_corrupt_backend(false);
+  test_background_sync_manager_->set_corrupt_backend(false);
   EXPECT_FALSE(GetRegistration(sync_options_1_));
   EXPECT_FALSE(Register(sync_options_2_));
 
@@ -1119,12 +1071,12 @@
 
 TEST_F(BackgroundSyncManagerTest, DisabledManagerWorksAfterDeleteAndStartOver) {
   EXPECT_TRUE(Register(sync_options_1_));
-  test_background_sync_manager()->set_corrupt_backend(true);
+  test_background_sync_manager_->set_corrupt_backend(true);
   EXPECT_FALSE(Register(sync_options_2_));
 
   // The manager is now disabled and not accepting new requests until browser
   // restart or notification that the storage has been wiped.
-  test_background_sync_manager()->set_corrupt_backend(false);
+  test_background_sync_manager_->set_corrupt_backend(false);
   DeleteServiceWorkerAndStartOver();
 
   RegisterServiceWorkers();
@@ -1287,10 +1239,10 @@
 
   // Corrupting the backend should result in the manager disabling itself on the
   // next operation.
-  test_background_sync_manager()->set_corrupt_backend(true);
+  test_background_sync_manager_->set_corrupt_backend(true);
   EXPECT_FALSE(Register(sync_options_2_));
 
-  test_background_sync_manager()->set_corrupt_backend(false);
+  test_background_sync_manager_->set_corrupt_backend(false);
   SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(0, sync_events_called_);
@@ -1304,9 +1256,9 @@
 
   // Corrupting the backend should result in the manager disabling itself on the
   // next operation.
-  test_background_sync_manager()->set_corrupt_backend(true);
+  test_background_sync_manager_->set_corrupt_backend(true);
   EXPECT_FALSE(Register(sync_options_2_));
-  test_background_sync_manager()->set_corrupt_backend(false);
+  test_background_sync_manager_->set_corrupt_backend(false);
 
   // Successfully complete the firing event. We can't verify that it actually
   // completed but at least we can test that it doesn't crash.
@@ -1411,7 +1363,7 @@
 
   RegisterAndVerifySyncEventDelayed(sync_options_1_);
 
-  test_background_sync_manager()->set_corrupt_backend(true);
+  test_background_sync_manager_->set_corrupt_backend(true);
   ASSERT_TRUE(sync_fired_callback_);
   std::move(sync_fired_callback_).Run(blink::ServiceWorkerStatusCode::kOk);
   base::RunLoop().RunUntilIdle();
@@ -1453,13 +1405,13 @@
 }
 
 TEST_F(BackgroundSyncManagerTest, RegisterWithoutMainFrame) {
-  test_background_sync_manager()->set_has_main_frame_provider_host(false);
+  test_background_sync_manager_->set_has_main_frame_provider_host(false);
   EXPECT_FALSE(Register(sync_options_1_));
 }
 
 TEST_F(BackgroundSyncManagerTest, RegisterExistingWithoutMainFrame) {
   EXPECT_TRUE(Register(sync_options_1_));
-  test_background_sync_manager()->set_has_main_frame_provider_host(false);
+  test_background_sync_manager_->set_has_main_frame_provider_host(false);
   EXPECT_FALSE(Register(sync_options_1_));
 }
 
@@ -1469,7 +1421,7 @@
   SetupBackgroundSyncManager();
 
   EXPECT_EQ(BackgroundSyncParameters(),
-            *test_background_sync_manager()->background_sync_parameters());
+            *test_background_sync_manager_->background_sync_parameters());
 }
 
 TEST_F(BackgroundSyncManagerTest, OverrideParameters) {
@@ -1491,7 +1443,7 @@
             one_shot_sync_callback_status_);
 
   const BackgroundSyncParameters* manager_parameters =
-      test_background_sync_manager()->background_sync_parameters();
+      test_background_sync_manager_->background_sync_parameters();
   EXPECT_EQ(*parameters, *manager_parameters);
 }
 
@@ -1545,92 +1497,36 @@
             GetController()->registration_origin());
 }
 
-TEST_F(BackgroundSyncManagerTest, WakeBrowserCalledForOneShotSync) {
+TEST_F(BackgroundSyncManagerTest, WakeBrowserCalled) {
   SetupBackgroundSyncManager();
   InitDelayedSyncEventTest();
 
   // The BackgroundSyncManager should declare in initialization
   // that it doesn't need to be woken up since it has no registrations.
   EXPECT_LT(0, GetController()->run_in_background_count());
-  EXPECT_FALSE(
-      test_background_sync_manager()->IsBrowserWakeupForOneShotSyncScheduled());
+  EXPECT_FALSE(test_background_sync_manager_->IsBrowserWakeupScheduled());
 
   SetNetwork(network::mojom::ConnectionType::CONNECTION_NONE);
-  EXPECT_FALSE(
-      test_background_sync_manager()->IsBrowserWakeupForOneShotSyncScheduled());
+  EXPECT_FALSE(test_background_sync_manager_->IsBrowserWakeupScheduled());
 
   // Register a one-shot but it can't fire due to lack of network, wake up is
   // required.
   Register(sync_options_1_);
-  EXPECT_TRUE(
-      test_background_sync_manager()->IsBrowserWakeupForOneShotSyncScheduled());
+  EXPECT_TRUE(test_background_sync_manager_->IsBrowserWakeupScheduled());
 
   // Start the event but it will pause mid-sync due to
   // InitDelayedSyncEventTest() above.
   SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI);
-  EXPECT_TRUE(
-      test_background_sync_manager()->IsBrowserWakeupForOneShotSyncScheduled());
-  EXPECT_TRUE(test_background_sync_manager()->EqualsSoonestOneShotWakeupDelta(
-      test_background_sync_manager()
-          ->background_sync_parameters()
+  EXPECT_TRUE(test_background_sync_manager_->IsBrowserWakeupScheduled());
+  EXPECT_TRUE(test_background_sync_manager_->EqualsSoonestOneShotWakeupDelta(
+      test_background_sync_manager_->background_sync_parameters()
           ->min_sync_recovery_time));
 
   // Finish the sync.
   ASSERT_TRUE(sync_fired_callback_);
   std::move(sync_fired_callback_).Run(blink::ServiceWorkerStatusCode::kOk);
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(
-      test_background_sync_manager()->IsBrowserWakeupForOneShotSyncScheduled());
-}
-
-TEST_F(BackgroundSyncManagerTest, WakeBrowserCalledForPeriodicSync) {
-  SetupBackgroundSyncManager();
-  InitDelayedPeriodicSyncEventTest();
-
-  // The BackgroundSyncManager should declare in initialization
-  // that it doesn't need to be woken up since it has no registrations.
-  EXPECT_LT(0, GetController()->run_in_background_periodic_sync_count());
-  EXPECT_FALSE(test_background_sync_manager()
-                   ->IsBrowserWakeupForPeriodicSyncScheduled());
-
-  SetNetwork(network::mojom::ConnectionType::CONNECTION_NONE);
-
-  // Register a periodic Background Sync but it can't fire due to lack of
-  // network, wake up is required.
-  base::TimeDelta thirteen_hours = base::TimeDelta::FromHours(13);
-  sync_options_1_.min_interval = thirteen_hours.InMilliseconds();
-  Register(sync_options_1_);
-  EXPECT_TRUE(test_background_sync_manager()
-                  ->IsBrowserWakeupForPeriodicSyncScheduled());
-  EXPECT_TRUE(
-      test_background_sync_manager()->EqualsSoonestPeriodicSyncWakeupDelta(
-          thirteen_hours));
-
-  // Advance clock.
-  test_clock_.Advance(
-      base::TimeDelta::FromMilliseconds(thirteen_hours.InMilliseconds()));
-
-  // Start the event but it will pause mid-sync due to
-  // InitDelayedPeriodicSyncEventTest() above.
-  SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI);
-  EXPECT_TRUE(test_background_sync_manager()
-                  ->IsBrowserWakeupForPeriodicSyncScheduled());
-  EXPECT_TRUE(
-      test_background_sync_manager()->EqualsSoonestPeriodicSyncWakeupDelta(
-          test_background_sync_manager()
-              ->background_sync_parameters()
-              ->min_sync_recovery_time));
-
-  // Finish the sync.
-  ASSERT_TRUE(periodic_sync_fired_callback_);
-  std::move(periodic_sync_fired_callback_)
-      .Run(blink::ServiceWorkerStatusCode::kOk);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(test_background_sync_manager()
-                  ->IsBrowserWakeupForPeriodicSyncScheduled());
-  EXPECT_TRUE(
-      test_background_sync_manager()->EqualsSoonestPeriodicSyncWakeupDelta(
-          thirteen_hours));
+  EXPECT_FALSE(test_background_sync_manager_->IsBrowserWakeupScheduled());
 }
 
 TEST_F(BackgroundSyncManagerTest, GetSoonestWakeupDeltaConsidersSyncType) {
@@ -1643,13 +1539,9 @@
   EXPECT_TRUE(Register(sync_options_2_));
   EXPECT_TRUE(GetRegistration(sync_options_2_));
 
-  EXPECT_EQ(GetSoonestWakeupDelta(
-                blink::mojom::BackgroundSyncType::ONE_SHOT,
-                /* last_browser_wakeup_for_periodic_sync= */ base::Time()),
+  EXPECT_EQ(GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::ONE_SHOT),
             base::TimeDelta());
-  EXPECT_EQ(GetSoonestWakeupDelta(
-                blink::mojom::BackgroundSyncType::PERIODIC,
-                /* last_browser_wakeup_for_periodic_sync= */ base::Time()),
+  EXPECT_EQ(GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::PERIODIC),
             base::TimeDelta::FromMilliseconds(sync_options_2_.min_interval));
 }
 
@@ -1660,69 +1552,26 @@
   EXPECT_TRUE(Register(sync_options_2_));
   EXPECT_TRUE(GetRegistration(sync_options_2_));
 
-  base::TimeDelta soonest_wakeup_delta_1 = GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType::PERIODIC,
-      /* last_browser_wakeup_for_periodic_sync= */ base::Time());
+  base::TimeDelta soonest_wakeup_delta_1 =
+      GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::PERIODIC);
 
   test_clock_.Advance(base::TimeDelta::FromMilliseconds(thirteen_hours_ms));
-  base::TimeDelta soonest_wakeup_delta_2 = GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType::PERIODIC,
-      /* last_browser_wakeup_for_periodic_sync= */ base::Time());
+  base::TimeDelta soonest_wakeup_delta_2 =
+      GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::PERIODIC);
 
   test_clock_.Advance(base::TimeDelta::FromMilliseconds(thirteen_hours_ms));
-  base::TimeDelta soonest_wakeup_delta_3 = GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType::PERIODIC,
-      /* last_browser_wakeup_for_periodic_sync= */ base::Time());
+  base::TimeDelta soonest_wakeup_delta_3 =
+      GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::PERIODIC);
 
   test_clock_.Advance(base::TimeDelta::FromMilliseconds(thirteen_hours_ms));
-  base::TimeDelta soonest_wakeup_delta_4 = GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType::PERIODIC,
-      /* last_browser_wakeup_for_periodic_sync= */ base::Time());
+  base::TimeDelta soonest_wakeup_delta_4 =
+      GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::PERIODIC);
 
   EXPECT_GT(soonest_wakeup_delta_1, soonest_wakeup_delta_2);
   EXPECT_GT(soonest_wakeup_delta_2, soonest_wakeup_delta_3);
   EXPECT_GT(soonest_wakeup_delta_3, soonest_wakeup_delta_4);
 }
 
-TEST_F(BackgroundSyncManagerTest, SoonestWakeupDeltaAppliesBrowserWakeupLimit) {
-  base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
-  SetPeriodicSyncEventsMinIntervalAndRestartManager(twelve_hours);
-
-  // Register a periodic sync.
-  // Hour zero.
-  base::TimeDelta thirteen_hours = base::TimeDelta::FromHours(13);
-  sync_options_1_.min_interval = thirteen_hours.InMilliseconds();
-  EXPECT_TRUE(Register(sync_options_1_));
-  EXPECT_TRUE(GetRegistration(sync_options_1_));
-  EXPECT_EQ(GetSoonestWakeupDelta(
-                blink::mojom::BackgroundSyncType::PERIODIC,
-                /* last_browser_wakeup_for_periodic_sync= */ base::Time()),
-            thirteen_hours);
-
-  // Advance the clock by an hour.
-  // Hour 1. Expect soonest_wakeup_delta to now be 12.
-  base::TimeDelta one_hour = base::TimeDelta::FromHours(1);
-  test_clock_.Advance(one_hour);
-  EXPECT_EQ(GetSoonestWakeupDelta(
-                blink::mojom::BackgroundSyncType::PERIODIC,
-                /* last_browser_wakeup_for_periodic_sync= */ base::Time()),
-            twelve_hours);
-  // Advance the clock by 12 hours. Hour 13.
-  test_clock_.Advance(base::TimeDelta::FromHours(9));
-  base::Time browser_wakeup_time = test_clock_.Now();
-  test_clock_.Advance(base::TimeDelta::FromHours(3));
-  EXPECT_EQ(
-      GetSoonestWakeupDelta(
-          blink::mojom::BackgroundSyncType::PERIODIC,
-          /* last_browser_wakeup_for_periodic_sync= */ browser_wakeup_time),
-      base::TimeDelta::FromHours(9));
-  EXPECT_EQ(GetSoonestWakeupDelta(
-                blink::mojom::BackgroundSyncType::PERIODIC,
-                /* last_browser_wakeup_for_periodic_sync= */ base::Time()),
-            base::TimeDelta());
-  Unregister(sync_options_1_);
-}
-
 TEST_F(BackgroundSyncManagerTest, OneAttempt) {
   SetMaxSyncAttemptsAndRestartManager(1);
   InitFailedSyncEventTest();
@@ -1739,19 +1588,17 @@
   // The first run will fail but it will setup a timer to try again.
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_TRUE(GetRegistration(sync_options_1_));
-  EXPECT_TRUE(
-      test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync());
+  EXPECT_TRUE(test_background_sync_manager_->IsDelayedTaskScheduled());
 
   // Make sure the delay is reasonable.
   EXPECT_LT(base::TimeDelta::FromMinutes(1),
-            test_background_sync_manager()->delayed_one_shot_sync_task_delta());
+            test_background_sync_manager_->delayed_task_delta());
   EXPECT_GT(base::TimeDelta::FromHours(1),
-            test_background_sync_manager()->delayed_one_shot_sync_task_delta());
+            test_background_sync_manager_->delayed_task_delta());
 
   // Fire again and this time it should permanently fail.
-  test_clock_.Advance(
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta());
-  test_background_sync_manager()->RunOneShotSyncDelayedTask();
+  test_clock_.Advance(test_background_sync_manager_->delayed_task_delta());
+  test_background_sync_manager_->RunDelayedTask();
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(GetRegistration(sync_options_1_));
 }
@@ -1763,26 +1610,22 @@
   // The first run will fail but it will setup a timer to try again.
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_TRUE(GetRegistration(sync_options_1_));
-  EXPECT_TRUE(
-      test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync());
+  EXPECT_TRUE(test_background_sync_manager_->IsDelayedTaskScheduled());
 
   // The second run will fail but it will setup a timer to try again.
   base::TimeDelta first_delta =
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta();
-  test_clock_.Advance(
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta());
-  test_background_sync_manager()->RunOneShotSyncDelayedTask();
+      test_background_sync_manager_->delayed_task_delta();
+  test_clock_.Advance(test_background_sync_manager_->delayed_task_delta());
+  test_background_sync_manager_->RunDelayedTask();
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(GetRegistration(sync_options_1_));
 
   // Verify that the delta grows for each attempt.
-  EXPECT_LT(first_delta,
-            test_background_sync_manager()->delayed_one_shot_sync_task_delta());
+  EXPECT_LT(first_delta, test_background_sync_manager_->delayed_task_delta());
 
   // The third run will permanently fail.
-  test_clock_.Advance(
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta());
-  test_background_sync_manager()->RunOneShotSyncDelayedTask();
+  test_clock_.Advance(test_background_sync_manager_->delayed_task_delta());
+  test_background_sync_manager_->RunDelayedTask();
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(GetRegistration(sync_options_1_));
 }
@@ -1794,23 +1637,21 @@
   // The first run will fail but it will setup a timer to try again.
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_TRUE(GetRegistration(sync_options_1_));
-  EXPECT_TRUE(
-      test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync());
+  EXPECT_TRUE(test_background_sync_manager_->IsDelayedTaskScheduled());
 
   // Fire again one second before it's ready to retry. Expect it to reschedule
   // the delay timer for one more second.
-  test_clock_.Advance(
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta() -
-      base::TimeDelta::FromSeconds(1));
-  test_background_sync_manager()->RunOneShotSyncDelayedTask();
+  test_clock_.Advance(test_background_sync_manager_->delayed_task_delta() -
+                      base::TimeDelta::FromSeconds(1));
+  test_background_sync_manager_->RunDelayedTask();
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(GetRegistration(sync_options_1_));
   EXPECT_EQ(base::TimeDelta::FromSeconds(1),
-            test_background_sync_manager()->delayed_one_shot_sync_task_delta());
+            test_background_sync_manager_->delayed_task_delta());
 
   // Fire one second later and it should fail permanently.
   test_clock_.Advance(base::TimeDelta::FromSeconds(1));
-  test_background_sync_manager()->RunOneShotSyncDelayedTask();
+  test_background_sync_manager_->RunDelayedTask();
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(GetRegistration(sync_options_1_));
 }
@@ -1824,8 +1665,7 @@
   EXPECT_TRUE(GetRegistration(sync_options_1_));
 
   // Simulate restarting the browser after sufficient time has passed.
-  base::TimeDelta delta =
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta();
+  base::TimeDelta delta = test_background_sync_manager_->delayed_task_delta();
   CreateBackgroundSyncManager();
   InitFailedSyncEventTest();
   test_clock_.Advance(delta);
@@ -1843,8 +1683,7 @@
   EXPECT_TRUE(GetRegistration(sync_options_1_));
 
   // Simulate restarting the browser before the retry timer has expired.
-  base::TimeDelta delta =
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta();
+  base::TimeDelta delta = test_background_sync_manager_->delayed_task_delta();
   CreateBackgroundSyncManager();
   InitFailedSyncEventTest();
   test_clock_.Advance(delta - base::TimeDelta::FromSeconds(1));
@@ -1852,7 +1691,7 @@
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(GetRegistration(sync_options_1_));
   EXPECT_EQ(base::TimeDelta::FromSeconds(1),
-            test_background_sync_manager()->delayed_one_shot_sync_task_delta());
+            test_background_sync_manager_->delayed_task_delta());
 }
 
 TEST_F(BackgroundSyncManagerTest, RetryIfClosedMidSync) {
@@ -1860,8 +1699,7 @@
 
   RegisterAndVerifySyncEventDelayed(sync_options_1_);
   // The time delta is the recovery timer.
-  base::TimeDelta delta =
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta();
+  base::TimeDelta delta = test_background_sync_manager_->delayed_task_delta();
 
   // Simulate restarting the browser after the recovery time, the event should
   // fire once and then fail permanently.
@@ -1881,25 +1719,21 @@
   EXPECT_TRUE(Register(sync_options_1_));
 
   // Run it a second time.
-  test_clock_.Advance(
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta());
-  test_background_sync_manager()->RunOneShotSyncDelayedTask();
+  test_clock_.Advance(test_background_sync_manager_->delayed_task_delta());
+  test_background_sync_manager_->RunDelayedTask();
   base::RunLoop().RunUntilIdle();
 
   base::TimeDelta delay_delta =
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta();
+      test_background_sync_manager_->delayed_task_delta();
 
   // Create a second registration, which will fail and setup a timer.
   EXPECT_TRUE(Register(sync_options_2_));
-  EXPECT_GT(delay_delta,
-            test_background_sync_manager()->delayed_one_shot_sync_task_delta());
+  EXPECT_GT(delay_delta, test_background_sync_manager_->delayed_task_delta());
 
-  while (test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync()) {
-    test_clock_.Advance(
-        test_background_sync_manager()->delayed_one_shot_sync_task_delta());
-    test_background_sync_manager()->RunOneShotSyncDelayedTask();
-    EXPECT_FALSE(
-        test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync());
+  while (test_background_sync_manager_->IsDelayedTaskScheduled()) {
+    test_clock_.Advance(test_background_sync_manager_->delayed_task_delta());
+    test_background_sync_manager_->RunDelayedTask();
+    EXPECT_FALSE(test_background_sync_manager_->IsDelayedTaskScheduled());
     base::RunLoop().RunUntilIdle();
   }
 
@@ -1912,28 +1746,27 @@
   InitFailedSyncEventTest();
 
   EXPECT_TRUE(Register(sync_options_1_));
-  EXPECT_FALSE(test_background_sync_manager()->last_chance());
+  EXPECT_FALSE(test_background_sync_manager_->last_chance());
   EXPECT_TRUE(GetRegistration(sync_options_1_));
 
   // Run it again.
-  test_clock_.Advance(
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta());
-  test_background_sync_manager()->RunOneShotSyncDelayedTask();
+  test_clock_.Advance(test_background_sync_manager_->delayed_task_delta());
+  test_background_sync_manager_->RunDelayedTask();
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(GetRegistration(sync_options_1_));
-  EXPECT_TRUE(test_background_sync_manager()->last_chance());
+  EXPECT_TRUE(test_background_sync_manager_->last_chance());
 }
 
 TEST_F(BackgroundSyncManagerTest, EmulateOfflineSingleClient) {
   InitSyncEventTest();
 
-  test_background_sync_manager()->EmulateServiceWorkerOffline(
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
       sw_registration_id_1_, true);
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_EQ(0, sync_events_called_);
   EXPECT_TRUE(GetRegistration(sync_options_1_));
 
-  test_background_sync_manager()->EmulateServiceWorkerOffline(
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
       sw_registration_id_1_, false);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, sync_events_called_);
@@ -1947,27 +1780,27 @@
 TEST_F(BackgroundSyncManagerTest, EmulateOfflineMultipleClients) {
   InitSyncEventTest();
 
-  test_background_sync_manager()->EmulateServiceWorkerOffline(
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
       sw_registration_id_1_, true);
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_EQ(0, sync_events_called_);
   EXPECT_TRUE(GetRegistration(sync_options_1_));
 
-  test_background_sync_manager()->EmulateServiceWorkerOffline(
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
       sw_registration_id_1_, true);
 
   EXPECT_TRUE(Register(sync_options_2_));
   EXPECT_EQ(0, sync_events_called_);
   EXPECT_TRUE(GetRegistration(sync_options_2_));
 
-  test_background_sync_manager()->EmulateServiceWorkerOffline(
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
       sw_registration_id_1_, false);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(0, sync_events_called_);
   EXPECT_TRUE(GetRegistration(sync_options_1_));
   EXPECT_TRUE(GetRegistration(sync_options_2_));
 
-  test_background_sync_manager()->EmulateServiceWorkerOffline(
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
       sw_registration_id_1_, false);
   base::RunLoop().RunUntilIdle();
 
@@ -1989,7 +1822,7 @@
   bool was_called = false;
   blink::ServiceWorkerStatusCode code =
       blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected;
-  test_background_sync_manager()->EmulateDispatchSyncEvent(
+  test_background_sync_manager_->EmulateDispatchSyncEvent(
       "emulated_tag", sw_registration_1_->active_version(), false,
       base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code));
   base::RunLoop().RunUntilIdle();
@@ -1998,24 +1831,24 @@
 
   EXPECT_EQ(1, sync_events_called_);
 
-  test_background_sync_manager()->EmulateServiceWorkerOffline(
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
       sw_registration_id_1_, true);
 
   was_called = false;
-  test_background_sync_manager()->EmulateDispatchSyncEvent(
+  test_background_sync_manager_->EmulateDispatchSyncEvent(
       "emulated_tag", sw_registration_1_->active_version(), false,
       base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code));
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(was_called);
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected, code);
 
-  test_background_sync_manager()->EmulateServiceWorkerOffline(
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
       sw_registration_id_1_, false);
 
   SetNetwork(network::mojom::ConnectionType::CONNECTION_NONE);
   was_called = false;
   code = blink::ServiceWorkerStatusCode::kOk;
-  test_background_sync_manager()->EmulateDispatchSyncEvent(
+  test_background_sync_manager_->EmulateDispatchSyncEvent(
       "emulated_tag", sw_registration_1_->active_version(), false,
       base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code));
   base::RunLoop().RunUntilIdle();
@@ -2024,7 +1857,7 @@
 
   SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI);
   was_called = false;
-  test_background_sync_manager()->EmulateDispatchSyncEvent(
+  test_background_sync_manager_->EmulateDispatchSyncEvent(
       "emulated_tag", sw_registration_1_->active_version(), false,
       base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code));
   base::RunLoop().RunUntilIdle();
@@ -2042,7 +1875,7 @@
   bool was_called = false;
   blink::ServiceWorkerStatusCode code =
       blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected;
-  test_background_sync_manager()->DispatchPeriodicSyncEvent(
+  test_background_sync_manager_->DispatchPeriodicSyncEvent(
       "test_tag", sw_registration_1_->active_version(),
       base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code));
   base::RunLoop().RunUntilIdle();
@@ -2067,16 +1900,14 @@
     // The first run will fail but it will setup a timer to try again.
     EXPECT_TRUE(Register(sync_options_1_));
     EXPECT_TRUE(GetRegistration(sync_options_1_));
-    EXPECT_TRUE(
-        test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync());
+    EXPECT_TRUE(test_background_sync_manager_->IsDelayedTaskScheduled());
   }
 
-  test_clock_.Advance(
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta());
+  test_clock_.Advance(test_background_sync_manager_->delayed_task_delta());
   {
     // Expect another "Fail" event.
     EXPECT_CALL(*this, OnEventReceived(_)).Times(1);
-    test_background_sync_manager()->RunOneShotSyncDelayedTask();
+    test_background_sync_manager_->RunDelayedTask();
     base::RunLoop().RunUntilIdle();
     EXPECT_TRUE(GetRegistration(sync_options_1_));
   }
@@ -2084,12 +1915,11 @@
   // The event should succeed now.
   InitSyncEventTest();
 
-  test_clock_.Advance(
-      test_background_sync_manager()->delayed_one_shot_sync_task_delta());
+  test_clock_.Advance(test_background_sync_manager_->delayed_task_delta());
   {
     // Expect a "Completion" event.
     EXPECT_CALL(*this, OnEventReceived(_)).Times(1);
-    test_background_sync_manager()->RunOneShotSyncDelayedTask();
+    test_background_sync_manager_->RunDelayedTask();
     base::RunLoop().RunUntilIdle();
     EXPECT_FALSE(GetRegistration(sync_options_1_));
   }
@@ -2102,7 +1932,7 @@
 
     EXPECT_TRUE(Register(sync_options_1_));
 
-    test_background_sync_manager()->RunOneShotSyncDelayedTask();
+    test_background_sync_manager_->RunDelayedTask();
     base::RunLoop().RunUntilIdle();
 
     EXPECT_FALSE(GetRegistration(sync_options_1_));
@@ -2122,7 +1952,7 @@
 
     EXPECT_TRUE(Register(sync_options_2_));
 
-    test_background_sync_manager()->RunOneShotSyncDelayedTask();
+    test_background_sync_manager_->RunDelayedTask();
     base::RunLoop().RunUntilIdle();
 
     EXPECT_FALSE(GetRegistration(sync_options_2_));
diff --git a/content/browser/background_sync/background_sync_proxy.cc b/content/browser/background_sync/background_sync_proxy.cc
deleted file mode 100644
index 1ddaf7e..0000000
--- a/content/browser/background_sync/background_sync_proxy.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/background_sync/background_sync_proxy.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/task/post_task.h"
-#include "base/task/task_traits.h"
-#include "content/browser/service_worker/service_worker_context_wrapper.h"
-#include "content/browser/storage_partition_impl.h"
-#include "content/public/browser/background_sync_context.h"
-#include "content/public/browser/background_sync_controller.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/browser/browser_task_traits.h"
-
-namespace content {
-
-class BackgroundSyncProxy::Core {
- public:
-  Core(const base::WeakPtr<BackgroundSyncProxy>& io_parent,
-       scoped_refptr<ServiceWorkerContextWrapper> service_worker_context)
-      : io_parent_(io_parent),
-        service_worker_context_(std::move(service_worker_context)),
-        weak_ptr_factory_(this) {
-    DCHECK_CURRENTLY_ON(BrowserThread::IO);
-    DCHECK(service_worker_context_);
-  }
-
-  ~Core() { DCHECK_CURRENTLY_ON(BrowserThread::UI); }
-
-  base::WeakPtr<Core> GetWeakPtrOnIO() {
-    DCHECK_CURRENTLY_ON(BrowserThread::IO);
-    return weak_ptr_factory_.GetWeakPtr();
-  }
-
-  BrowserContext* browser_context() {
-    DCHECK_CURRENTLY_ON(BrowserThread::UI);
-    if (!service_worker_context_)
-      return nullptr;
-
-    StoragePartitionImpl* storage_partition_impl =
-        service_worker_context_->storage_partition();
-    if (!storage_partition_impl)  // may be null in tests
-      return nullptr;
-
-    return storage_partition_impl->browser_context();
-  }
-
-  // TODO(crbug.com/982378): Schedule a task to periodically revive suspended
-  // periodic Background Sync registrations.
-  void ScheduleBrowserWakeUp(blink::mojom::BackgroundSyncType sync_type) {
-    DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-    if (!browser_context())
-      return;
-
-    auto* controller = browser_context()->GetBackgroundSyncController();
-    DCHECK(controller);
-
-    controller->ScheduleBrowserWakeUp(sync_type);
-  }
-
- private:
-  base::WeakPtr<BackgroundSyncProxy> io_parent_;
-  scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_;
-  base::WeakPtrFactory<Core> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(Core);
-};
-
-BackgroundSyncProxy::BackgroundSyncProxy(
-    scoped_refptr<ServiceWorkerContextWrapper> service_worker_context)
-    : weak_ptr_factory_(this) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(service_worker_context);
-  ui_core_ = std::unique_ptr<Core, BrowserThread::DeleteOnUIThread>(new Core(
-      weak_ptr_factory_.GetWeakPtr(), std::move(service_worker_context)));
-  ui_core_weak_ptr_ = ui_core_->GetWeakPtrOnIO();
-}
-
-BackgroundSyncProxy::~BackgroundSyncProxy() = default;
-
-void BackgroundSyncProxy::ScheduleBrowserWakeUp(
-    blink::mojom::BackgroundSyncType sync_type) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  // Schedule Chrome wakeup.
-  base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI},
-                           base::BindOnce(&Core::ScheduleBrowserWakeUp,
-                                          ui_core_weak_ptr_, sync_type));
-}
-
-}  // namespace content
diff --git a/content/browser/background_sync/background_sync_proxy.h b/content/browser/background_sync/background_sync_proxy.h
deleted file mode 100644
index 01c72cd6..0000000
--- a/content/browser/background_sync/background_sync_proxy.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_PROXY_H_
-#define CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_PROXY_H_
-
-#include <memory>
-
-#include "base/callback.h"
-#include "base/memory/weak_ptr.h"
-#include "base/time/time.h"
-#include "content/common/content_export.h"
-#include "content/public/browser/browser_thread.h"
-#include "third_party/blink/public/mojom/background_sync/background_sync.mojom.h"
-
-namespace content {
-
-class ServiceWorkerContextWrapper;
-
-// This class is used to take messages from BackgroundSyncManager on the IO
-// thread and pass them on BackgroundSyncController on the UI thread through
-// its Core class which lives on the UI thread.
-// This is owned by the BackgroundSyncManager.
-class CONTENT_EXPORT BackgroundSyncProxy {
- public:
-  explicit BackgroundSyncProxy(
-      scoped_refptr<ServiceWorkerContextWrapper> service_worker_context);
-  ~BackgroundSyncProxy();
-
-  void ScheduleBrowserWakeUp(blink::mojom::BackgroundSyncType sync_type);
-
- private:
-  // Constructed on the IO thread, lives and dies on the UI thread.
-  class Core;
-
-  std::unique_ptr<Core, BrowserThread::DeleteOnUIThread> ui_core_;
-  base::WeakPtr<Core> ui_core_weak_ptr_;
-  base::WeakPtrFactory<BackgroundSyncProxy> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(BackgroundSyncProxy);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_PROXY_H_
diff --git a/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc b/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc
index a56c8d6..2cd3b2ed 100644
--- a/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc
+++ b/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc
@@ -1149,6 +1149,7 @@
 
   if (!match->response) {
     entry->Doom();
+    query_cache_context->matches->pop_back();
     QueryCacheOpenNextEntry(std::move(query_cache_context));
     return;
   }
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 2a465d3e..9a7e084 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -1725,6 +1725,8 @@
   // If this is a top-frame navigation, then use the origin of the url (and
   // update it as redirects happen). If this is a sub-frame navigation, get the
   // URL from the top frame.
+  // TODO(crbug.com/979296): Consider changing this code to copy an origin
+  // instead of creating one from a URL which lacks opacity information.
   GURL top_frame_url =
       frame_tree_node_->IsMainFrame()
           ? common_params_.url
@@ -1741,8 +1743,9 @@
       browser_context, browser_context->GetResourceContext(), partition,
       std::make_unique<NavigationRequestInfo>(
           common_params_, begin_params_.Clone(), site_for_cookies,
-          top_frame_origin, frame_tree_node_->IsMainFrame(),
-          parent_is_main_frame, IsSecureFrame(frame_tree_node_->parent()),
+          net::NetworkIsolationKey(top_frame_origin),
+          frame_tree_node_->IsMainFrame(), parent_is_main_frame,
+          IsSecureFrame(frame_tree_node_->parent()),
           frame_tree_node_->frame_tree_node_id(), is_for_guests_only,
           report_raw_headers,
           navigating_frame_host->GetVisibilityState() ==
diff --git a/content/browser/frame_host/navigation_request_info.cc b/content/browser/frame_host/navigation_request_info.cc
index 32c56e2..e4491f8 100644
--- a/content/browser/frame_host/navigation_request_info.cc
+++ b/content/browser/frame_host/navigation_request_info.cc
@@ -10,7 +10,7 @@
     const CommonNavigationParams& common_params,
     mojom::BeginNavigationParamsPtr begin_params,
     const GURL& site_for_cookies,
-    const base::Optional<url::Origin>& top_frame_origin,
+    const net::NetworkIsolationKey& network_isolation_key,
     bool is_main_frame,
     bool parent_is_main_frame,
     bool are_ancestors_secure,
@@ -26,7 +26,7 @@
     : common_params(common_params),
       begin_params(std::move(begin_params)),
       site_for_cookies(site_for_cookies),
-      top_frame_origin(top_frame_origin),
+      network_isolation_key(network_isolation_key),
       is_main_frame(is_main_frame),
       parent_is_main_frame(parent_is_main_frame),
       are_ancestors_secure(are_ancestors_secure),
diff --git a/content/browser/frame_host/navigation_request_info.h b/content/browser/frame_host/navigation_request_info.h
index 42fef93..78dd2a2 100644
--- a/content/browser/frame_host/navigation_request_info.h
+++ b/content/browser/frame_host/navigation_request_info.h
@@ -26,7 +26,7 @@
   NavigationRequestInfo(const CommonNavigationParams& common_params,
                         mojom::BeginNavigationParamsPtr begin_params,
                         const GURL& site_for_cookies,
-                        const base::Optional<url::Origin>& top_frame_origin,
+                        const net::NetworkIsolationKey& network_isolation_key,
                         bool is_main_frame,
                         bool parent_is_main_frame,
                         bool are_ancestors_secure,
@@ -49,11 +49,9 @@
   // checked by the third-party cookie blocking policy.
   const GURL site_for_cookies;
 
-  // The origin of the navigation if top frame, else the origin of the top
-  // frame.
-  // TODO(crbug.com/910716) Make this required. I believe we just need to add
-  // support for signed exchange redirects.
-  const base::Optional<url::Origin> top_frame_origin;
+  // Navigation resource requests will be keyed using |network_isolation_key|
+  // for accessing shared network resources like the http cache.
+  const net::NetworkIsolationKey network_isolation_key;
 
   const bool is_main_frame;
   const bool parent_is_main_frame;
diff --git a/content/browser/frame_host/navigator_impl_unittest.cc b/content/browser/frame_host/navigator_impl_unittest.cc
index 8680202..bfb50dbe 100644
--- a/content/browser/frame_host/navigator_impl_unittest.cc
+++ b/content/browser/frame_host/navigator_impl_unittest.cc
@@ -290,8 +290,8 @@
   EXPECT_EQ(kUrl2, subframe_loader->request_info()->common_params.url);
   // First party for cookies url should be that of the main frame.
   EXPECT_EQ(kUrl1, subframe_loader->request_info()->site_for_cookies);
-  EXPECT_EQ(url::Origin::Create(kUrl1),
-            subframe_loader->request_info()->top_frame_origin);
+  EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(kUrl1)),
+            subframe_loader->request_info()->network_isolation_key);
   EXPECT_FALSE(subframe_loader->request_info()->is_main_frame);
   EXPECT_TRUE(subframe_loader->request_info()->parent_is_main_frame);
   EXPECT_TRUE(subframe_request->browser_initiated());
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 696ef2b..145bfe5 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -4264,7 +4264,13 @@
   }
 
   registry_->AddInterface(base::BindRepeating(
-      &media::MediaMetricsProvider::Create, frame_tree_node_->IsMainFrame(),
+      &media::MediaMetricsProvider::Create,
+      GetProcess()->GetBrowserContext()->IsOffTheRecord()
+          ? media::MediaMetricsProvider::BrowsingMode::kIncognito
+          : media::MediaMetricsProvider::BrowsingMode::kNormal,
+      frame_tree_node_->IsMainFrame()
+          ? media::MediaMetricsProvider::FrameStatus::kTopFrame
+          : media::MediaMetricsProvider::FrameStatus::kNotTopFrame,
       base::BindRepeating(
           &RenderFrameHostDelegate::GetUkmSourceIdForLastCommittedSource,
           // This callback is only executed when Create() is called, during
@@ -4321,18 +4327,13 @@
     registry_->AddInterface(base::BindRepeating(
         [](RenderFrameHostImpl* frame,
            blink::mojom::NativeFileSystemManagerRequest request) {
-          scoped_refptr<NativeFileSystemManagerImpl> manager =
+          NativeFileSystemManagerImpl::BindRequestFromUIThread(
               static_cast<StoragePartitionImpl*>(
-                  frame->GetProcess()->GetStoragePartition())
-                  ->GetNativeFileSystemManager();
-          base::PostTaskWithTraits(
-              FROM_HERE, {BrowserThread::IO},
-              base::BindOnce(
-                  &NativeFileSystemManagerImpl::BindRequest, std::move(manager),
-                  NativeFileSystemManagerImpl::BindingContext(
-                      frame->GetLastCommittedOrigin(),
-                      frame->GetProcess()->GetID(), frame->GetRoutingID()),
-                  std::move(request)));
+                  frame->GetProcess()->GetStoragePartition()),
+              NativeFileSystemManagerImpl::BindingContext(
+                  frame->GetLastCommittedOrigin(), frame->GetProcess()->GetID(),
+                  frame->GetRoutingID()),
+              std::move(request));
         },
         base::Unretained(this)));
   }
@@ -4881,6 +4882,8 @@
   // common_params.url currently leads to an opaque origin to be created. Once
   // this is fixed, the origin which these navigations eventually get committed
   // to will be available here as well.
+  // TODO(crbug.com/979296): Consider changing this code to copy an origin
+  // instead of creating one from a URL which lacks opacity information.
   if (!is_same_document) {
     base::Optional<url::Origin> top_frame_origin =
         frame_tree_node_->IsMainFrame() ? url::Origin::Create(common_params.url)
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc
index c559dbc2..9e3bb5b 100644
--- a/content/browser/frame_host/render_frame_host_manager_unittest.cc
+++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc
@@ -459,7 +459,7 @@
 // then do that same thing in another tab, that the two resulting pages have
 // different SiteInstances, BrowsingInstances, and RenderProcessHosts. This is
 // a regression test for bug 9364.
-TEST_F(RenderFrameHostManagerTest, NewTabPageProcesses) {
+TEST_F(RenderFrameHostManagerTest, ChromeSchemeProcesses) {
   set_should_create_webui(true);
   const GURL kChromeUrl(GetWebUIURL("foo"));
   const GURL kDestUrl("http://www.google.com/");
@@ -503,8 +503,8 @@
   EXPECT_FALSE(dest_rfh2->GetSiteInstance()->IsRelatedSiteInstance(
                    contents()->GetMainFrame()->GetSiteInstance()));
 
-  // Navigate both to the new tab page, and verify that they share a
-  // RenderProcessHost (not a SiteInstance).
+  // Navigate both to a chrome://... URL, and verify that they have a separate
+  // RenderProcessHost and a separate SiteInstance.
   NavigationSimulator::NavigateAndCommitFromBrowser(contents(), kChromeUrl);
   EXPECT_FALSE(contents()->GetPendingMainFrame());
 
@@ -513,7 +513,7 @@
 
   EXPECT_NE(contents()->GetMainFrame()->GetSiteInstance(),
             contents2->GetMainFrame()->GetSiteInstance());
-  EXPECT_EQ(contents()->GetMainFrame()->GetSiteInstance()->GetProcess(),
+  EXPECT_NE(contents()->GetMainFrame()->GetSiteInstance()->GetProcess(),
             contents2->GetMainFrame()->GetSiteInstance()->GetProcess());
 }
 
diff --git a/content/browser/indexed_db/database_impl.cc b/content/browser/indexed_db/database_impl.cc
index 1894904bb..42413a7 100644
--- a/content/browser/indexed_db/database_impl.cc
+++ b/content/browser/indexed_db/database_impl.cc
@@ -33,6 +33,7 @@
 namespace content {
 namespace {
 
+const char kBadTransactionMode[] = "Bad transaction mode";
 const char kTransactionAlreadyExists[] = "Transaction already exists";
 
 }  // namespace
@@ -91,6 +92,12 @@
   if (!connection_->IsConnected())
     return;
 
+  if (mode != blink::mojom::IDBTransactionMode::ReadOnly &&
+      mode != blink::mojom::IDBTransactionMode::ReadWrite) {
+    mojo::ReportBadMessage(kBadTransactionMode);
+    return;
+  }
+
   if (connection_->GetTransaction(transaction_id)) {
     mojo::ReportBadMessage(kTransactionAlreadyExists);
     return;
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index 5eb338c..26e18d241 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -195,7 +195,14 @@
   new_request->method = request_info->common_params.method;
   new_request->url = request_info->common_params.url;
   new_request->site_for_cookies = request_info->site_for_cookies;
-  new_request->top_frame_origin = request_info->top_frame_origin;
+  new_request->trusted_network_isolation_key =
+      request_info->network_isolation_key;
+
+  if (request_info->is_main_frame) {
+    new_request->update_network_isolation_key_on_redirect =
+        network::mojom::UpdateNetworkIsolationKeyOnRedirect::
+            kUpdateTopFrameAndInitiatingFrameOrigin;
+  }
 
   net::RequestPriority net_priority = net::HIGHEST;
   if (!request_info->is_main_frame &&
@@ -276,7 +283,7 @@
   return std::make_unique<NavigationRequestInfo>(
       std::move(new_common_params), std::move(new_begin_params),
       updated_resource_request.site_for_cookies,
-      updated_resource_request.top_frame_origin,
+      updated_resource_request.trusted_network_isolation_key,
       previous_request_info.is_main_frame,
       previous_request_info.parent_is_main_frame,
       previous_request_info.are_ancestors_secure,
@@ -1112,7 +1119,17 @@
     resource_request_->url = redirect_info_.new_url;
     resource_request_->method = redirect_info_.new_method;
     resource_request_->site_for_cookies = redirect_info_.new_site_for_cookies;
-    resource_request_->top_frame_origin = redirect_info_.new_top_frame_origin;
+
+    // See if navigation network isolation key needs to be updated.
+    // TODO(crbug.com/950069): Also add the case for ResourceType::kSubFrame.
+    if (resource_request_->resource_type ==
+        static_cast<int>(ResourceType::kMainFrame)) {
+      base::Optional<url::Origin> origin =
+          url::Origin::Create(resource_request_->url);
+      resource_request_->trusted_network_isolation_key =
+          net::NetworkIsolationKey(origin, origin);
+    }
+
     resource_request_->referrer = GURL(redirect_info_.new_referrer);
     resource_request_->referrer_policy = redirect_info_.new_referrer_policy;
     resource_request_->previews_state = new_previews_state;
diff --git a/content/browser/loader/navigation_url_loader_impl_unittest.cc b/content/browser/loader/navigation_url_loader_impl_unittest.cc
index b1351d10c..5ac8fb9 100644
--- a/content/browser/loader/navigation_url_loader_impl_unittest.cc
+++ b/content/browser/loader/navigation_url_loader_impl_unittest.cc
@@ -186,7 +186,7 @@
     std::unique_ptr<NavigationRequestInfo> request_info(
         new NavigationRequestInfo(
             common_params, std::move(begin_params), url,
-            url::Origin::Create(url), is_main_frame,
+            net::NetworkIsolationKey(url::Origin::Create(url)), is_main_frame,
             false /* parent_is_main_frame */, false /* are_ancestors_secure */,
             -1 /* frame_tree_node_id */, false /* is_for_guests_only */,
             false /* report_raw_headers */, false /* is_prerenering */,
@@ -314,7 +314,7 @@
             NavigateAndReturnRequestPriority(url, false /* is_main_frame */));
 }
 
-TEST_F(NavigationURLLoaderImplTest, TopFrameOriginOfMainFrameNavigation) {
+TEST_F(NavigationURLLoaderImplTest, NetworkIsolationKeyOfMainFrameNavigation) {
   ASSERT_TRUE(http_test_server_.Start());
 
   const GURL url = http_test_server_.GetURL("/foo");
@@ -329,12 +329,12 @@
   delegate.WaitForRequestStarted();
 
   ASSERT_TRUE(most_recent_resource_request_);
-  EXPECT_EQ(url::Origin::Create(url),
-            *most_recent_resource_request_->top_frame_origin);
+  EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(url)),
+            most_recent_resource_request_->trusted_network_isolation_key);
 }
 
 TEST_F(NavigationURLLoaderImplTest,
-       TopFrameOriginOfRedirectedMainFrameNavigation) {
+       NetworkIsolationKeyOfRedirectedMainFrameNavigation) {
   ASSERT_TRUE(http_test_server_.Start());
 
   const GURL url = http_test_server_.GetURL("/redirect301-to-echo");
@@ -342,8 +342,8 @@
 
   HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
 
-  EXPECT_EQ(url::Origin::Create(final_url),
-            *most_recent_resource_request_->top_frame_origin);
+  EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(final_url)),
+            most_recent_resource_request_->trusted_network_isolation_key);
 }
 
 TEST_F(NavigationURLLoaderImplTest, Redirect301Tests) {
diff --git a/content/browser/loader/navigation_url_loader_unittest.cc b/content/browser/loader/navigation_url_loader_unittest.cc
index 24640725..a97c47d 100644
--- a/content/browser/loader/navigation_url_loader_unittest.cc
+++ b/content/browser/loader/navigation_url_loader_unittest.cc
@@ -100,11 +100,12 @@
     common_params.initiator_origin = url::Origin::Create(url);
 
     std::unique_ptr<NavigationRequestInfo> request_info(
-        new NavigationRequestInfo(common_params, std::move(begin_params), url,
-                                  url::Origin::Create(url), true, false, false,
-                                  -1, false, false, false, false, nullptr,
-                                  base::UnguessableToken::Create(),
-                                  base::UnguessableToken::Create()));
+        new NavigationRequestInfo(
+            common_params, std::move(begin_params), url,
+            net::NetworkIsolationKey(url::Origin::Create(url)), true, false,
+            false, -1, false, false, false, false, nullptr,
+            base::UnguessableToken::Create(),
+            base::UnguessableToken::Create()));
     return NavigationURLLoader::Create(
         browser_context_.get(), browser_context_->GetResourceContext(),
         BrowserContext::GetDefaultStoragePartition(browser_context_.get()),
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
index c257dec..a87b6a6 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.cc
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -1439,7 +1439,7 @@
 
   new_request->set_method(info.common_params.method);
   new_request->set_site_for_cookies(info.site_for_cookies);
-  new_request->set_top_frame_origin(info.top_frame_origin);
+  new_request->set_network_isolation_key(info.network_isolation_key);
   new_request->set_initiator(info.common_params.initiator_origin);
   new_request->set_upgrade_if_insecure(info.upgrade_if_insecure);
   if (info.is_main_frame) {
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc
index 642aebf4..bb9a7847 100644
--- a/content/browser/loader/resource_dispatcher_host_unittest.cc
+++ b/content/browser/loader/resource_dispatcher_host_unittest.cc
@@ -839,11 +839,12 @@
     common_params.initiator_origin = url::Origin::Create(url);
 
     std::unique_ptr<NavigationRequestInfo> request_info(
-        new NavigationRequestInfo(common_params, std::move(begin_params), url,
-                                  url::Origin::Create(url), true, false, false,
-                                  -1, false, false, false, false, nullptr,
-                                  base::UnguessableToken::Create(),
-                                  base::UnguessableToken::Create()));
+        new NavigationRequestInfo(
+            common_params, std::move(begin_params), url,
+            net::NetworkIsolationKey(url::Origin::Create(url)), true, false,
+            false, -1, false, false, false, false, nullptr,
+            base::UnguessableToken::Create(),
+            base::UnguessableToken::Create()));
     std::unique_ptr<NavigationURLLoader> test_loader =
         NavigationURLLoader::Create(
             browser_context_.get(), browser_context_->GetResourceContext(),
diff --git a/content/browser/media/cdm_file_impl.cc b/content/browser/media/cdm_file_impl.cc
index d20c292..ceb8c58 100644
--- a/content/browser/media/cdm_file_impl.cc
+++ b/content/browser/media/cdm_file_impl.cc
@@ -13,6 +13,12 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
 #include "base/task/post_task.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "media/base/bind_to_current_loop.h"
+#include "net/base/io_buffer.h"
+#include "net/base/net_errors.h"
+#include "storage/browser/fileapi/file_stream_reader.h"
 #include "storage/browser/fileapi/file_system_context.h"
 #include "storage/browser/fileapi/file_system_operation_context.h"
 #include "storage/browser/fileapi/file_system_url.h"
@@ -109,55 +115,6 @@
   return file_lock_map;
 }
 
-// Read the contents of |file| and return it. On success, returns kSuccess and
-// |data| is updated with the contents of the file. On failure kFailure is
-// returned. This method owns |file| and it will be closed at the end.
-CdmFileImpl::Status ReadFile(base::File file, std::vector<uint8_t>* data) {
-  DCHECK(data->empty());
-
-  // Determine the size of the file (so we know how many bytes to read).
-  // Negative bytes mean failure, so problem with the file.
-  int64_t num_bytes = file.GetLength();
-  if (num_bytes < 0) {
-    DLOG(WARNING) << __func__
-                  << " Unable to get file length. result = " << num_bytes;
-    return CdmFileImpl::Status::kFailure;
-  }
-
-  // Files are limited in size, so fail if file too big.
-  if (num_bytes > kMaxFileSizeBytes) {
-    DLOG(WARNING) << __func__
-                  << " Too much data to read. #bytes = " << num_bytes;
-    return CdmFileImpl::Status::kFailure;
-  }
-
-  // If the file has 0 bytes, no need to read anything.
-  if (num_bytes == 0) {
-    return CdmFileImpl::Status::kSuccess;
-  }
-
-  // Read the contents of the file. Read() sizes (provided and returned) are
-  // type int, so cast appropriately.
-  int bytes_to_read = base::checked_cast<int>(num_bytes);
-  data->resize(num_bytes);
-
-  TRACE_EVENT0("media", "CdmFileReadFile");
-  base::TimeTicks start = base::TimeTicks::Now();
-  int bytes_read =
-      file.Read(0, reinterpret_cast<char*>(data->data()), bytes_to_read);
-  base::TimeDelta read_time = base::TimeTicks::Now() - start;
-  if (bytes_to_read != bytes_read) {
-    // Unable to read the contents of the file.
-    DLOG(WARNING) << "Failed to read file. Requested " << bytes_to_read
-                  << " bytes, got " << bytes_read;
-    return CdmFileImpl::Status::kFailure;
-  }
-
-  // Only report reading time for successful reads.
-  UMA_HISTOGRAM_TIMES("Media.EME.CdmFileIO.ReadTime", read_time);
-  return CdmFileImpl::Status::kSuccess;
-}
-
 // Write |data| to |file|. Returns kSuccess if everything works, kFailure
 // otherwise.  This method owns |file| and it will be closed at the end.
 CdmFileImpl::Status WriteFile(base::File file, std::vector<uint8_t> data) {
@@ -182,8 +139,152 @@
   return CdmFileImpl::Status::kSuccess;
 }
 
+// File stream operations need an IOBuffer to hold the data. This class stores
+// the data in a std::vector<uint8_t> to match what is used in the
+// mojom::CdmFile API.
+class CdmFileIOBuffer : public net::IOBuffer {
+ public:
+  // Create an empty buffer of size |size|.
+  explicit CdmFileIOBuffer(size_t size) : buffer_(size) {
+    data_ = reinterpret_cast<char*>(buffer_.data());
+  }
+
+  // Returns ownership of |buffer_| to the caller.
+  std::vector<uint8_t>&& TakeData() { return std::move(buffer_); }
+
+ protected:
+  ~CdmFileIOBuffer() override { data_ = nullptr; }
+
+ private:
+  std::vector<uint8_t> buffer_;
+};
+
 }  // namespace
 
+// Read a file using FileStreamReader. Implemented as a separate class so that
+// it can be run on the IO thread.
+class CdmFileImpl::FileReader {
+ public:
+  // Returns whether the read operation succeeded or not. If |result| = true,
+  // then |data| is the contents of the file.
+  using ReadDoneCB =
+      base::OnceCallback<void(bool result, std::vector<uint8_t> data)>;
+
+  FileReader() = default;
+
+  // Reads the contents of |file_url| and calls |callback| with the result
+  // (file contents on success, empty data on error).
+  void Read(scoped_refptr<storage::FileSystemContext> file_system_context,
+            const storage::FileSystemURL& file_url,
+            ReadDoneCB callback) {
+    DVLOG(3) << __func__ << " url: " << file_url.DebugString();
+    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    DCHECK(!callback_);
+    DCHECK(!file_stream_reader_);
+
+    callback_ = std::move(callback);
+
+    file_stream_reader_ = file_system_context->CreateFileStreamReader(
+        file_url, 0, kMaxFileSizeBytes, base::Time());
+    auto result = file_stream_reader_->GetLength(
+        base::BindOnce(&FileReader::OnGetLength, weak_factory_.GetWeakPtr()));
+    DVLOG(3) << __func__ << " GetLength(): " << result;
+
+    // If GetLength() is running asynchronously, simply return.
+    if (result == net::ERR_IO_PENDING)
+      return;
+
+    // GetLength() was synchronous, so pass the result on.
+    OnGetLength(result);
+  }
+
+ private:
+  // Called when the size of the file to be read is known. Allocates a buffer
+  // large enough to hold the contents, then attempts to read the contents into
+  // the buffer. |result| will be the length of the file (if >= 0) or a net::
+  // error on failure (if < 0).
+  void OnGetLength(int64_t result) {
+    DVLOG(3) << __func__ << " result: " << result;
+    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    DCHECK(callback_);
+    DCHECK(file_stream_reader_);
+
+    // If the file doesn't exist, then pretend it is empty.
+    if (result == net::ERR_FILE_NOT_FOUND) {
+      std::move(callback_).Run(true, {});
+      return;
+    }
+
+    // Any other failure is an error.
+    if (result < 0) {
+      DLOG(WARNING) << __func__
+                    << " Unable to get file length. result = " << result;
+      std::move(callback_).Run(false, {});
+      return;
+    }
+
+    // Files are limited in size, so fail if file too big.
+    if (result > kMaxFileSizeBytes) {
+      DLOG(WARNING) << __func__
+                    << " Too much data to read. #bytes = " << result;
+      std::move(callback_).Run(false, {});
+      return;
+    }
+
+    // Read() sizes (provided and returned) are type int, so cast appropriately.
+    int bytes_to_read = base::checked_cast<int>(result);
+    auto buffer = base::MakeRefCounted<CdmFileIOBuffer>(
+        base::checked_cast<size_t>(bytes_to_read));
+
+    // Read the contents of the file into |buffer|.
+    result = file_stream_reader_->Read(
+        buffer.get(), bytes_to_read,
+        base::BindOnce(&FileReader::OnRead, weak_factory_.GetWeakPtr(), buffer,
+                       bytes_to_read));
+    DVLOG(3) << __func__ << " Read(): " << result;
+
+    // If Read() is running asynchronously, simply return.
+    if (result == net::ERR_IO_PENDING)
+      return;
+
+    // Read() was synchronous, so pass the result on.
+    OnRead(std::move(buffer), bytes_to_read, result);
+  }
+
+  // Called when the file has been read and returns the result to the callback
+  // provided to Read(). |result| will be the number of bytes read (if >= 0) or
+  // a net:: error on failure (if < 0).
+  void OnRead(scoped_refptr<CdmFileIOBuffer> buffer,
+              int bytes_to_read,
+              int result) {
+    DVLOG(3) << __func__ << " Requested " << bytes_to_read << " bytes, got "
+             << result;
+    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    DCHECK(callback_);
+    DCHECK(file_stream_reader_);
+
+    if (result != bytes_to_read) {
+      // Unable to read the contents of the file completely.
+      DLOG(WARNING) << "Failed to read file. Requested " << bytes_to_read
+                    << " bytes, got " << result;
+      std::move(callback_).Run(false, {});
+      return;
+    }
+
+    // Successful read. Return the bytes read.
+    std::move(callback_).Run(true, std::move(buffer->TakeData()));
+  }
+
+  // Called when the read operation is done.
+  ReadDoneCB callback_;
+
+  // Used to read the stream.
+  std::unique_ptr<storage::FileStreamReader> file_stream_reader_;
+
+  base::WeakPtrFactory<FileReader> weak_factory_{this};
+  DISALLOW_COPY_AND_ASSIGN(FileReader);
+};
+
 // static
 bool CdmFileImpl::IsValidName(const std::string& name) {
   // File names must only contain letters (A-Za-z), digits(0-9), or "._-",
@@ -224,6 +325,15 @@
   DVLOG(3) << __func__ << " " << file_name_;
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
+  if (read_callback_)
+    std::move(read_callback_).Run(Status::kFailure, {});
+
+  if (file_reader_) {
+    // |file_reader_| must be deleted on the IO thread.
+    base::CreateSequencedTaskRunner({BrowserThread::IO})
+        ->DeleteSoon(FROM_HERE, std::move(file_reader_));
+  }
+
   if (file_locked_)
     ReleaseFileLock(file_name_);
 }
@@ -250,13 +360,45 @@
   DVLOG(3) << __func__ << " file: " << file_name_;
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(file_locked_);
-  DCHECK(data_.empty());
 
-  // Open the file for reading. This may fail if the file does not currently
-  // exist, which needs to be handled.
-  OpenFile(file_name_, base::File::FLAG_OPEN | base::File::FLAG_READ,
-           base::BindOnce(&CdmFileImpl::OnFileOpenedForReading,
-                          weak_factory_.GetWeakPtr(), std::move(callback)));
+  // Save |callback| for later use.
+  read_callback_ = std::move(callback);
+
+  // As reading is done on the IO thread, when it's done ReadDone() needs to be
+  // called back on this thread.
+  auto read_done_cb = media::BindToCurrentLoop(
+      base::BindOnce(&CdmFileImpl::ReadDone, weak_factory_.GetWeakPtr()));
+
+  // Create the file reader that runs on the IO thread, and then call Read() on
+  // the IO thread. Use of base::Unretained() is OK as the reader is owned by
+  // |this|, and if |this| is destructed it will destroy the file reader on the
+  // IO thread.
+  file_reader_ = std::make_unique<FileReader>();
+  base::PostTaskWithTraits(
+      FROM_HERE, {BrowserThread::IO},
+      base::BindOnce(&FileReader::Read, base::Unretained(file_reader_.get()),
+                     file_system_context_, CreateFileSystemURL(file_name_),
+                     std::move(read_done_cb)));
+}
+
+void CdmFileImpl::ReadDone(bool success, std::vector<uint8_t> data) {
+  DVLOG(3) << __func__ << " file: " << file_name_
+           << ", success: " << (success ? "yes" : "no");
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(file_locked_);
+  DCHECK(file_reader_);
+  DCHECK(read_callback_);
+
+  // We are done with the reader, so destroy it.
+  file_reader_.reset();
+
+  if (!success) {
+    // Unable to read the contents of the file.
+    std::move(read_callback_).Run(Status::kFailure, {});
+    return;
+  }
+
+  std::move(read_callback_).Run(Status::kSuccess, std::move(data));
 }
 
 void CdmFileImpl::OpenFile(const std::string& file_name,
@@ -279,52 +421,11 @@
                           std::move(callback));
 }
 
-void CdmFileImpl::OnFileOpenedForReading(ReadCallback callback,
-                                         base::File file,
-                                         base::OnceClosure on_close_callback) {
-  DVLOG(3) << __func__ << " file: " << file_name_;
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(file_locked_);
-
-  if (!file.IsValid()) {
-    // File is invalid, so assume that it is empty.
-    DVLOG(2) << "Unable to open file " << file_name_
-             << ", error: " << base::File::ErrorToString(file.error_details());
-    std::move(callback).Run(
-        file.error_details() == base::File::FILE_ERROR_NOT_FOUND
-            ? Status::kSuccess
-            : Status::kFailure,
-        std::vector<uint8_t>());
-    return;
-  }
-
-  // Reading |file| must be done on a thread that allows blocking, so post a
-  // task to do the read on a separate thread. When that completes simply call
-  // |callback| with the results.
-  base::PostTaskWithTraitsAndReplyWithResult(
-      FROM_HERE,
-      {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
-      base::BindOnce(&ReadFile, std::move(file), &data_),
-      base::BindOnce(&CdmFileImpl::OnFileRead, weak_factory_.GetWeakPtr(),
-                     std::move(callback)));
-}
-
-void CdmFileImpl::OnFileRead(ReadCallback callback, Status status) {
-  DVLOG(3) << __func__ << " file: " << file_name_;
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(file_locked_);
-
-  std::vector<uint8_t> data;
-  data.swap(data_);
-  std::move(callback).Run(status, std::move(data));
-}
-
 void CdmFileImpl::Write(const std::vector<uint8_t>& data,
                         WriteCallback callback) {
   DVLOG(3) << __func__ << " file: " << file_name_ << ", size: " << data.size();
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(file_locked_);
-  DCHECK(data_.empty());
 
   // If there is no data to write, delete the file to save space.
   if (data.empty()) {
diff --git a/content/browser/media/cdm_file_impl.h b/content/browser/media/cdm_file_impl.h
index 1133508..5eeb5f81 100644
--- a/content/browser/media/cdm_file_impl.h
+++ b/content/browser/media/cdm_file_impl.h
@@ -50,6 +50,8 @@
   void Write(const std::vector<uint8_t>& data, WriteCallback callback) final;
 
  private:
+  class FileReader;
+
   using CreateOrOpenCallback = storage::AsyncFileUtil::CreateOrOpenCallback;
 
   // Open the file |file_name| using the flags provided in |file_flags|.
@@ -58,12 +60,9 @@
                 uint32_t file_flags,
                 CreateOrOpenCallback callback);
 
-  // Called when the file has been opened for reading, so it reads the contents
-  // of |file| and passes them to |callback|. |file| is closed after reading.
-  void OnFileOpenedForReading(ReadCallback callback,
-                              base::File file,
-                              base::OnceClosure on_close_callback);
-  void OnFileRead(ReadCallback callback, Status status);
+  // Called when the file is read. If |success| is true, |data| is the contents
+  // of the file read.
+  void ReadDone(bool success, std::vector<uint8_t> data);
 
   // Called when |temp_file_name_| has been opened for writing. Writes
   // |data| to |file|, closes |file|, and then kicks off a rename of
@@ -106,8 +105,9 @@
   // |temp_file_name| is not required.
   bool file_locked_ = false;
 
-  // Buffer used when reading the file.
-  std::vector<uint8_t> data_;
+  // Used when reading the file. |file_reader_| lives on the IO thread.
+  ReadCallback read_callback_;
+  std::unique_ptr<FileReader> file_reader_;
 
   THREAD_CHECKER(thread_checker_);
   base::WeakPtrFactory<CdmFileImpl> weak_factory_{this};
diff --git a/content/browser/media/cdm_storage_impl_unittest.cc b/content/browser/media/cdm_storage_impl_unittest.cc
index 7f9743f..b6a8f9a 100644
--- a/content/browser/media/cdm_storage_impl_unittest.cc
+++ b/content/browser/media/cdm_storage_impl_unittest.cc
@@ -44,6 +44,11 @@
 }  // namespace
 
 class CdmStorageTest : public RenderViewHostTestHarness {
+ public:
+  CdmStorageTest()
+      : RenderViewHostTestHarness(
+            content::TestBrowserThreadBundle::REAL_IO_THREAD) {}
+
  protected:
   void SetUp() final {
     RenderViewHostTestHarness::SetUp();
diff --git a/content/browser/media/media_internals.cc b/content/browser/media/media_internals.cc
index 3e2b27a..e9c9d4f 100644
--- a/content/browser/media/media_internals.cc
+++ b/content/browser/media/media_internals.cc
@@ -105,23 +105,6 @@
   return "unknown";
 }
 
-// Whether the player is in incognito mode or ChromeOS guest mode.
-bool IsIncognito(int render_process_id) {
-  content::RenderProcessHost* render_process_host =
-      content::RenderProcessHost::FromID(render_process_id);
-  if (!render_process_host) {
-    // This could happen in tests.
-    LOG(ERROR) << "Cannot get RenderProcessHost";
-    return false;
-  }
-
-  content::BrowserContext* browser_context =
-      render_process_host->GetBrowserContext();
-  DCHECK(browser_context);
-
-  return browser_context->IsOffTheRecord();
-}
-
 const char kAudioLogStatusKey[] = "status";
 const char kAudioLogUpdateFunction[] = "media.updateAudioComponent";
 
@@ -318,272 +301,12 @@
   dict->SetInteger("component_type", component_);
 }
 
-// This class lives on the browser UI thread.
-class MediaInternals::MediaInternalsUMAHandler {
- public:
-  MediaInternalsUMAHandler();
-
-  // Called when a render process is terminated. Reports the pipeline status to
-  // UMA for every player associated with the renderer process and then deletes
-  // the player state.
-  void OnProcessTerminated(int render_process_id);
-
-  // Helper function to save the event payload to RendererPlayerMap.
-  void SavePlayerState(int render_process_id,
-                       const media::MediaLogEvent& event);
-
- private:
-  struct PipelineInfo {
-    explicit PipelineInfo(bool is_incognito) : is_incognito(is_incognito) {}
-
-    bool has_pipeline = false;
-    bool has_ever_played = false;
-    bool has_reached_have_enough = false;
-    media::PipelineStatus last_pipeline_status = media::PIPELINE_OK;
-    bool has_audio = false;
-    bool has_video = false;
-    bool video_dds = false;
-    bool video_decoder_changed = false;
-    bool has_cdm = false;
-    bool is_incognito = false;
-    std::string video_codec_name;
-    std::string video_decoder;
-    bool is_platform_video_decoder = false;
-  };
-
-  // Helper function to report PipelineStatus associated with a player to UMA.
-  void ReportUMAForPipelineStatus(const PipelineInfo& player_info);
-
-  // Helper to generate PipelineStatus UMA name for AudioVideo streams.
-  std::string GetUMANameForAVStream(const PipelineInfo& player_info);
-
-  // Key is player id.
-  typedef std::map<int, PipelineInfo> PlayerInfoMap;
-
-  // Key is renderer id.
-  typedef std::map<int, PlayerInfoMap> RendererPlayerMap;
-
-  // Stores player information per renderer.
-  RendererPlayerMap renderer_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(MediaInternalsUMAHandler);
-};
-
-MediaInternals::MediaInternalsUMAHandler::MediaInternalsUMAHandler() {}
-
-void MediaInternals::MediaInternalsUMAHandler::SavePlayerState(
-    int render_process_id,
-    const media::MediaLogEvent& event) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  PlayerInfoMap& player_info_map = renderer_info_[render_process_id];
-
-  auto it = player_info_map.find(event.id);
-  if (it == player_info_map.end()) {
-    if (event.type != media::MediaLogEvent::WEBMEDIAPLAYER_CREATED) {
-      // Due to the asynchronous cleanup order of PipelineImpl and WMPI,
-      // sometimes a kStopped / kStopping event can sneak in after
-      // WEBMEDIAPLAYER_DESTROYED. This causes a new memory leak because the
-      // newly created PipelineImpl would never get cleaned up.
-      // As a result, we should be dropping any event that would target a
-      // player that hasn't already been created.
-      return;
-    }
-    bool success = false;
-    std::tie(it, success) = player_info_map.emplace(
-        std::make_pair(event.id, PipelineInfo(IsIncognito(render_process_id))));
-    if (!success) {
-      LOG(ERROR) << "Failed to insert a new PipelineInfo.";
-      return;
-    }
-  }
-
-  PipelineInfo& player_info = it->second;
-
-  switch (event.type) {
-    case media::MediaLogEvent::PLAY: {
-      player_info.has_ever_played = true;
-      break;
-    }
-    case media::MediaLogEvent::PIPELINE_STATE_CHANGED: {
-      player_info.has_pipeline = true;
-      break;
-    }
-    case media::MediaLogEvent::PIPELINE_ERROR: {
-      int status = static_cast<media::PipelineStatus>(media::PIPELINE_OK);
-      event.params.GetInteger("pipeline_error", &status);
-      player_info.last_pipeline_status =
-          static_cast<media::PipelineStatus>(status);
-      break;
-    }
-    case media::MediaLogEvent::PROPERTY_CHANGE:
-      if (event.params.HasKey("found_audio_stream")) {
-        event.params.GetBoolean("found_audio_stream", &player_info.has_audio);
-      }
-      if (event.params.HasKey("found_video_stream")) {
-        event.params.GetBoolean("found_video_stream", &player_info.has_video);
-      }
-      if (event.params.HasKey("video_codec_name")) {
-        event.params.GetString("video_codec_name",
-                               &player_info.video_codec_name);
-      }
-      if (event.params.HasKey("video_decoder")) {
-        std::string previous_video_decoder(player_info.video_decoder);
-        event.params.GetString("video_decoder", &player_info.video_decoder);
-        if (!previous_video_decoder.empty() &&
-            previous_video_decoder != player_info.video_decoder) {
-          player_info.video_decoder_changed = true;
-        }
-      }
-      if (event.params.HasKey("is_platform_video_decoder")) {
-        event.params.GetBoolean("is_platform_video_decoder",
-                                &player_info.is_platform_video_decoder);
-      }
-      if (event.params.HasKey("video_dds")) {
-        event.params.GetBoolean("video_dds", &player_info.video_dds);
-      }
-      if (event.params.HasKey("has_cdm")) {
-        event.params.GetBoolean("has_cdm", &player_info.has_cdm);
-      }
-      if (event.params.HasKey("pipeline_buffering_state")) {
-        std::string buffering_state;
-        event.params.GetString("pipeline_buffering_state", &buffering_state);
-
-        bool for_suspended_start;
-        event.params.GetBoolean("for_suspended_start", &for_suspended_start);
-
-        // Ignore the BUFFERING_HAVE_ENOUGH event if it was for a suspended
-        // start. Otherwise we won't reflect reductions to the HasEverPlayed
-        // statistic.
-        if (buffering_state == "BUFFERING_HAVE_ENOUGH" && !for_suspended_start)
-          player_info.has_reached_have_enough = true;
-      }
-      break;
-    case media::MediaLogEvent::Type::WEBMEDIAPLAYER_DESTROYED: {
-      // Upon player destruction report UMA data; if the player is not torn down
-      // before process exit, it will be logged during OnProcessTerminated().
-      ReportUMAForPipelineStatus(player_info);
-      player_info_map.erase(it);
-      break;
-    }
-    default:
-      break;
-  }
-  return;
-}
-
-std::string MediaInternals::MediaInternalsUMAHandler::GetUMANameForAVStream(
-    const PipelineInfo& player_info) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  static const char kPipelineUmaPrefix[] = "Media.PipelineStatus.AudioVideo.";
-  std::string uma_name = kPipelineUmaPrefix;
-  if (player_info.video_codec_name == "vp8") {
-    uma_name += "VP8.";
-  } else if (player_info.video_codec_name == "vp9") {
-    uma_name += "VP9.";
-  } else if (player_info.video_codec_name == "h264") {
-    uma_name += "H264.";
-  } else if (player_info.video_codec_name == "av1") {
-    uma_name += "AV1.";
-  } else {
-    return uma_name + "Other";
-  }
-
-#if !defined(OS_ANDROID)
-  if (player_info.video_decoder ==
-      media::DecryptingVideoDecoder::kDecoderName) {
-    return uma_name + "DVD";
-  }
-#endif
-
-  if (player_info.video_dds) {
-    uma_name += "DDS.";
-  }
-
-  // Note that HW essentailly means 'platform' anyway. MediaCodec has been
-  // reported as HW forever, regardless of the underlying platform
-  // implementation.
-  if (player_info.is_platform_video_decoder) {
-    uma_name += "HW";
-  } else {
-    uma_name += "SW";
-  }
-  return uma_name;
-}
-
-// TODO(xhwang): This function reports more metrics than just pipeline status
-// and should be renamed. Similarly, PipelineInfo should be PlayerInfo.
-void MediaInternals::MediaInternalsUMAHandler::ReportUMAForPipelineStatus(
-    const PipelineInfo& player_info) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  // Don't log pipeline status for players which don't actually have a pipeline;
-  // e.g., the Android MediaSourcePlayer implementation.
-  if (!player_info.has_pipeline)
-    return;
-
-  if (player_info.has_video && player_info.has_audio) {
-    base::UmaHistogramExactLinear(GetUMANameForAVStream(player_info),
-                                  player_info.last_pipeline_status,
-                                  media::PIPELINE_STATUS_MAX);
-  } else if (player_info.has_audio) {
-    UMA_HISTOGRAM_ENUMERATION("Media.PipelineStatus.AudioOnly",
-                              player_info.last_pipeline_status,
-                              media::PIPELINE_STATUS_MAX + 1);
-  } else if (player_info.has_video) {
-    UMA_HISTOGRAM_ENUMERATION("Media.PipelineStatus.VideoOnly",
-                              player_info.last_pipeline_status,
-                              media::PIPELINE_STATUS_MAX + 1);
-  } else {
-    // Note: This metric can be recorded as a result of normal operation with
-    // Media Source Extensions. If a site creates a MediaSource object but never
-    // creates a source buffer or appends data, PIPELINE_OK will be recorded.
-    UMA_HISTOGRAM_ENUMERATION("Media.PipelineStatus.Unsupported",
-                              player_info.last_pipeline_status,
-                              media::PIPELINE_STATUS_MAX + 1);
-  }
-  // Report whether video decoder fallback happened, but only if a video decoder
-  // was reported.
-  if (!player_info.video_decoder.empty()) {
-    UMA_HISTOGRAM_BOOLEAN("Media.VideoDecoderFallback",
-                          player_info.video_decoder_changed);
-  }
-
-  // Report whether this player ever saw a playback event. Used to measure the
-  // effectiveness of efforts to reduce loaded-but-never-used players.
-  if (player_info.has_reached_have_enough)
-    UMA_HISTOGRAM_BOOLEAN("Media.HasEverPlayed", player_info.has_ever_played);
-
-  // Report whether an encrypted playback is in incognito window, excluding
-  // never-used players.
-  if (player_info.has_cdm && player_info.has_ever_played)
-    UMA_HISTOGRAM_BOOLEAN("Media.EME.IsIncognito", player_info.is_incognito);
-}
-
-void MediaInternals::MediaInternalsUMAHandler::OnProcessTerminated(
-    int render_process_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  auto players_it = renderer_info_.find(render_process_id);
-  if (players_it == renderer_info_.end())
-    return;
-  auto it = players_it->second.begin();
-  while (it != players_it->second.end()) {
-    ReportUMAForPipelineStatus(it->second);
-    players_it->second.erase(it++);
-  }
-  renderer_info_.erase(players_it);
-}
-
 MediaInternals* MediaInternals::GetInstance() {
   static content::MediaInternals* internals = new content::MediaInternals();
   return internals;
 }
 
-MediaInternals::MediaInternals()
-    : can_update_(false),
-      owner_ids_(),
-      uma_handler_(new MediaInternalsUMAHandler()) {
+MediaInternals::MediaInternals() : can_update_(false), owner_ids_() {
   // TODO(sandersd): Is there ever a relevant case where TERMINATED is sent
   // without CLOSED also being sent?
   registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED,
@@ -599,7 +322,6 @@
                              const NotificationDetails& details) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   RenderProcessHost* process = Source<RenderProcessHost>(source).ptr();
-  uma_handler_->OnProcessTerminated(process->GetID());
   // TODO(sandersd): Send a termination event before clearing the log.
   saved_events_by_process_.erase(process->GetID());
 }
@@ -652,7 +374,6 @@
         SendUpdate(update);
     }
     SaveEvent(render_process_id, event);
-    uma_handler_->SavePlayerState(render_process_id, event);
   }
 }
 
@@ -835,10 +556,6 @@
                                         render_frame_id);
 }
 
-void MediaInternals::OnProcessTerminatedForTesting(int process_id) {
-  uma_handler_->OnProcessTerminated(process_id);
-}
-
 void MediaInternals::SendUpdate(const base::string16& update) {
   // SendUpdate() may be called from any thread, but must run on the UI thread.
   if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
diff --git a/content/browser/media/media_internals.h b/content/browser/media/media_internals.h
index 8fe7a781..3acdbfd 100644
--- a/content/browser/media/media_internals.h
+++ b/content/browser/media/media_internals.h
@@ -113,8 +113,6 @@
                           int render_process_id = -1,
                           int render_frame_id = MSG_ROUTING_NONE);
 
-  void OnProcessTerminatedForTesting(int process_id);
-
  private:
   // Needs access to SendUpdate.
   friend class MediaInternalsAudioFocusHelper;
@@ -169,7 +167,6 @@
   bool can_update_;
   base::DictionaryValue audio_streams_cached_data_;
   int owner_ids_[media::AudioLogFactory::AUDIO_COMPONENT_MAX];
-  std::unique_ptr<MediaInternalsUMAHandler> uma_handler_;
 
   DISALLOW_COPY_AND_ASSIGN(MediaInternals);
 };
diff --git a/content/browser/native_file_system/native_file_system_handle_base.cc b/content/browser/native_file_system/native_file_system_handle_base.cc
index 6887c3cb..4a48421 100644
--- a/content/browser/native_file_system/native_file_system_handle_base.cc
+++ b/content/browser/native_file_system/native_file_system_handle_base.cc
@@ -132,7 +132,15 @@
     base::OnceCallback<void(PermissionStatus)> callback) {
   PermissionStatus current_status =
       writable ? GetWritePermissionStatus() : GetReadPermissionStatus();
-  if (current_status != PermissionStatus::ASK) {
+  // If we already have a valid permission status, just return that. Also just
+  // return the current permission status if this is called from a worker, as we
+  // don't support prompting for increased permissions from workers.
+  //
+  // Currently the worker check here is redundant because there is no way for
+  // workers to get native file system handles. While workers will never be able
+  // to call chooseEntries(), they will be able to receive existing handles from
+  // windows via postMessage() and IndexedDB.
+  if (current_status != PermissionStatus::ASK || context_.is_worker()) {
     std::move(callback).Run(current_status);
     return;
   }
diff --git a/content/browser/native_file_system/native_file_system_manager_impl.cc b/content/browser/native_file_system/native_file_system_manager_impl.cc
index 799845d..e3057f0a 100644
--- a/content/browser/native_file_system/native_file_system_manager_impl.cc
+++ b/content/browser/native_file_system/native_file_system_manager_impl.cc
@@ -12,11 +12,13 @@
 #include "content/browser/native_file_system/native_file_system_file_handle_impl.h"
 #include "content/browser/native_file_system/native_file_system_file_writer_impl.h"
 #include "content/browser/native_file_system/native_file_system_transfer_token_impl.h"
+#include "content/browser/storage_partition_impl.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_switches.h"
 #include "mojo/public/cpp/bindings/callback_helpers.h"
+#include "services/network/public/cpp/is_potentially_trustworthy.h"
 #include "storage/browser/fileapi/file_system_context.h"
 #include "storage/browser/fileapi/file_system_operation_runner.h"
 #include "storage/browser/fileapi/file_system_url.h"
@@ -125,9 +127,29 @@
 
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
+  DCHECK(network::IsOriginPotentiallyTrustworthy(binding_context.origin));
   bindings_.AddBinding(this, std::move(request), binding_context);
 }
 
+// static
+void NativeFileSystemManagerImpl::BindRequestFromUIThread(
+    StoragePartitionImpl* storage_partition,
+    const BindingContext& binding_context,
+    blink::mojom::NativeFileSystemManagerRequest request) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (!network::IsOriginPotentiallyTrustworthy(binding_context.origin)) {
+    mojo::ReportBadMessage("Native File System access from Unsecure Origin");
+    return;
+  }
+
+  auto* manager = storage_partition->GetNativeFileSystemManager();
+  base::PostTaskWithTraits(
+      FROM_HERE, {BrowserThread::IO},
+      base::BindOnce(&NativeFileSystemManagerImpl::BindRequest,
+                     base::Unretained(manager), binding_context,
+                     std::move(request)));
+}
+
 void NativeFileSystemManagerImpl::GetSandboxedFileSystem(
     GetSandboxedFileSystemCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -149,6 +171,13 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   const BindingContext& context = bindings_.dispatch_context();
 
+  // ChooseEntries API is only available to windows, as we need a frame to
+  // anchor the picker to.
+  if (context.is_worker()) {
+    bindings_.ReportBadMessage("ChooseEntries called from a worker");
+    return;
+  }
+
   base::PostTaskWithTraits(
       FROM_HERE, {BrowserThread::UI},
       base::BindOnce(
diff --git a/content/browser/native_file_system/native_file_system_manager_impl.h b/content/browser/native_file_system/native_file_system_manager_impl.h
index ba04c5c49..dc5b946 100644
--- a/content/browser/native_file_system/native_file_system_manager_impl.h
+++ b/content/browser/native_file_system/native_file_system_manager_impl.h
@@ -29,6 +29,7 @@
 class NativeFileSystemFileHandleImpl;
 class NativeFileSystemDirectoryHandleImpl;
 class NativeFileSystemTransferTokenImpl;
+class StoragePartitionImpl;
 
 // This is the browser side implementation of the
 // NativeFileSystemManager mojom interface. This is the main entry point for
@@ -78,6 +79,11 @@
   void BindRequest(const BindingContext& binding_context,
                    blink::mojom::NativeFileSystemManagerRequest request);
 
+  static void BindRequestFromUIThread(
+      StoragePartitionImpl* storage_partition,
+      const BindingContext& binding_context,
+      blink::mojom::NativeFileSystemManagerRequest request);
+
   // blink::mojom::NativeFileSystemManager:
   void GetSandboxedFileSystem(GetSandboxedFileSystemCallback callback) override;
   void ChooseEntries(
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc
index d150c51..ffbc55f 100644
--- a/content/browser/navigation_browsertest.cc
+++ b/content/browser/navigation_browsertest.cc
@@ -62,6 +62,7 @@
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/url_request/url_request_failed_job.h"
 #include "services/network/public/cpp/features.h"
+#include "services/network/public/mojom/url_loader.mojom.h"
 #include "url/gurl.h"
 
 namespace content {
@@ -253,13 +254,15 @@
   }
 
   // Navigate to |url| and for each ResourceRequest record its
-  // top_frame_origin. Stop listening after |final_resource| has been
-  // detected. The output is recorded in |top_frame_origins|.
-  void NavigateAndRecordTopFrameOrigins(
+  // trusted_network_isolation_key. Stop listening after |final_resource| has
+  // been detected. The output is recorded in |network_isolation_keys|.
+  void NavigateAndRecordNetworkIsolationKeys(
       const GURL& url,
       const GURL& final_resource,
       bool from_renderer,
-      std::map<GURL, url::Origin>* top_frame_origins) {
+      std::map<GURL, net::NetworkIsolationKey>* network_isolation_keys,
+      std::map<GURL, network::mojom::UpdateNetworkIsolationKeyOnRedirect>*
+          update_network_isolation_key_on_redirects) {
     if (from_renderer)
       EXPECT_TRUE(NavigateToURL(shell(), GURL("about:blank")));
 
@@ -270,8 +273,11 @@
     URLLoaderInterceptor interceptor(base::BindLambdaForTesting(
         [&](URLLoaderInterceptor::RequestParams* params) -> bool {
           base::AutoLock top_frame_origins_lock(lock);
-          (*top_frame_origins)[params->url_request.url] =
-              *params->url_request.top_frame_origin;
+          (*network_isolation_keys)[params->url_request.url] =
+              params->url_request.trusted_network_isolation_key;
+          (*update_network_isolation_key_on_redirects)[params->url_request
+                                                           .url] =
+              params->url_request.update_network_isolation_key_on_redirect;
 
           if (params->url_request.url == final_resource)
             run_loop.Quit();
@@ -825,50 +831,59 @@
   EXPECT_EQ("\"done\"", done);
 }
 
-IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, BrowserNavigationTopFrameOrigin) {
-  std::map<GURL, url::Origin> top_frame_origins;
+IN_PROC_BROWSER_TEST_P(NavigationBrowserTest,
+                       BrowserNavigationNetworkIsolationKey) {
+  std::map<GURL, net::NetworkIsolationKey> network_isolation_keys;
+  std::map<GURL, network::mojom::UpdateNetworkIsolationKeyOnRedirect>
+      update_network_isolation_key_on_redirects;
   GURL url(embedded_test_server()->GetURL("/title1.html"));
 
-  NavigateAndRecordTopFrameOrigins(url, url /* final_resource */,
-                                   false /* from_renderer */,
-                                   &top_frame_origins);
-  EXPECT_EQ(url::Origin::Create(url), top_frame_origins[url]);
+  NavigateAndRecordNetworkIsolationKeys(
+      url, url /* final_resource */, false /* from_renderer */,
+      &network_isolation_keys, &update_network_isolation_key_on_redirects);
+  EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(url)),
+            network_isolation_keys[url]);
+  EXPECT_EQ(network::mojom::UpdateNetworkIsolationKeyOnRedirect::
+                kUpdateTopFrameAndInitiatingFrameOrigin,
+            update_network_isolation_key_on_redirects[url]);
 }
 
-IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, RenderNavigationTopFrameOrigin) {
-  std::map<GURL, url::Origin> top_frame_origins;
+IN_PROC_BROWSER_TEST_P(NavigationBrowserTest,
+                       RenderNavigationNetworkIsolationKey) {
+  std::map<GURL, net::NetworkIsolationKey> network_isolation_keys;
+  std::map<GURL, network::mojom::UpdateNetworkIsolationKeyOnRedirect>
+      update_network_isolation_key_on_redirects;
   GURL url(embedded_test_server()->GetURL("/title2.html"));
 
-  NavigateAndRecordTopFrameOrigins(url, url /* final_resource */,
-                                   true /* from_renderer */,
-                                   &top_frame_origins);
-  EXPECT_EQ(url::Origin::Create(url), top_frame_origins[url]);
+  NavigateAndRecordNetworkIsolationKeys(
+      url, url /* final_resource */, true /* from_renderer */,
+      &network_isolation_keys, &update_network_isolation_key_on_redirects);
+  EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(url)),
+            network_isolation_keys[url]);
+  EXPECT_EQ(network::mojom::UpdateNetworkIsolationKeyOnRedirect::
+                kUpdateTopFrameAndInitiatingFrameOrigin,
+            update_network_isolation_key_on_redirects[url]);
 }
 
-IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, SubframeTopFrameOrigin) {
-  std::map<GURL, url::Origin> top_frame_origins;
+IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, SubframeNetworkIsolationKey) {
+  std::map<GURL, net::NetworkIsolationKey> network_isolation_keys;
+  std::map<GURL, network::mojom::UpdateNetworkIsolationKeyOnRedirect>
+      update_network_isolation_key_on_redirects;
   GURL url(embedded_test_server()->GetURL("/page_with_iframe.html"));
   GURL iframe_document = embedded_test_server()->GetURL("/title1.html");
 
-  NavigateAndRecordTopFrameOrigins(url, iframe_document /* final_resource */,
-                                   false /* from_renderer */,
-                                   &top_frame_origins);
-  EXPECT_EQ(url::Origin::Create(url), top_frame_origins[url]);
-  EXPECT_EQ(url::Origin::Create(url), top_frame_origins[iframe_document]);
-}
-
-IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, SubresourceTopFrameOrigin) {
-  std::map<GURL, url::Origin> top_frame_origins;
-  GURL url(embedded_test_server()->GetURL("/page_with_iframe_and_image.html"));
-  GURL blank_image = embedded_test_server()->GetURL("/blank.jpg");
-
-  NavigateAndRecordTopFrameOrigins(url, blank_image /* final_resource */,
-                                   false /* from_renderer */,
-                                   &top_frame_origins);
-  EXPECT_EQ(url::Origin::Create(url), top_frame_origins[url]);
-  EXPECT_EQ(url::Origin::Create(url),
-            top_frame_origins[embedded_test_server()->GetURL("/image.jpg")]);
-  EXPECT_EQ(url::Origin::Create(url), top_frame_origins[blank_image]);
+  NavigateAndRecordNetworkIsolationKeys(
+      url, iframe_document /* final_resource */, false /* from_renderer */,
+      &network_isolation_keys, &update_network_isolation_key_on_redirects);
+  EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(url)),
+            network_isolation_keys[url]);
+  EXPECT_EQ(network::mojom::UpdateNetworkIsolationKeyOnRedirect::
+                kUpdateTopFrameAndInitiatingFrameOrigin,
+            update_network_isolation_key_on_redirects[url]);
+  EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(url)),
+            network_isolation_keys[iframe_document]);
+  EXPECT_EQ(network::mojom::UpdateNetworkIsolationKeyOnRedirect::kDoNotUpdate,
+            update_network_isolation_key_on_redirects[iframe_document]);
 }
 
 // Helper class to extract the initiator values from URLLoaderFactory calls
diff --git a/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc b/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc
index 2fae4d0..8ea6f50 100644
--- a/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc
+++ b/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc
@@ -427,7 +427,7 @@
   if (FAILED(hr))
     return;
 
-  DCHECK(system_font_set->GetFontCount() > 0);
+  DCHECK_GT(system_font_set->GetFontCount(), 0U);
 
   mswr::ComPtr<IDWriteFontSet> filtered_set;
 
@@ -435,8 +435,7 @@
                      &unique_font_name](DWRITE_FONT_PROPERTY_ID property_id) {
     TRACE_EVENT0("dwrite,fonts",
                  "DWriteFontProxyImpl::MatchUniqueFont::filter_set");
-    std::wstring unique_font_name_wide =
-        base::UTF16ToWide(unique_font_name).c_str();
+    std::wstring unique_font_name_wide = base::UTF16ToWide(unique_font_name);
     DWRITE_FONT_PROPERTY search_property = {property_id,
                                             unique_font_name_wide.c_str(), L""};
     // GetMatchingFonts() matches all languages according to:
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index f680ed83..716ce08 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3867,15 +3867,6 @@
   if (url.SchemeIs(kChromeErrorScheme))
     return true;
 
-  // We want to consolidate particular sites like WebUI even when we are using
-  // the process-per-tab or process-per-site-instance models.
-  // Note: DevTools pages have WebUI type but should not reuse the same host.
-  if (WebUIControllerFactoryRegistry::GetInstance()->UseWebUIForURL(
-          browser_context, url) &&
-      !url.SchemeIs(kChromeDevToolsScheme)) {
-    return true;
-  }
-
   // Otherwise let the content client decide, defaulting to false.
   return GetContentClient()->browser()->ShouldUseProcessPerSite(browser_context,
                                                                 url);
diff --git a/content/browser/renderer_interface_binders.cc b/content/browser/renderer_interface_binders.cc
index 442280a2..c7c8e498 100644
--- a/content/browser/renderer_interface_binders.cc
+++ b/content/browser/renderer_interface_binders.cc
@@ -165,19 +165,14 @@
     parameterized_binder_registry_.AddInterface(base::BindRepeating(
         [](blink::mojom::NativeFileSystemManagerRequest request,
            RenderProcessHost* host, const url::Origin& origin) {
-          auto* manager =
-              static_cast<StoragePartitionImpl*>(host->GetStoragePartition())
-                  ->GetNativeFileSystemManager();
           // This code path is only for workers, hence always pass in
           // MSG_ROUTING_NONE as frame ID. Frames themselves go through
           // RenderFrameHostImpl instead.
-          base::PostTaskWithTraits(
-              FROM_HERE, {BrowserThread::IO},
-              base::BindOnce(&NativeFileSystemManagerImpl::BindRequest,
-                             base::Unretained(manager),
-                             NativeFileSystemManagerImpl::BindingContext(
-                                 origin, host->GetID(), MSG_ROUTING_NONE),
-                             std::move(request)));
+          NativeFileSystemManagerImpl::BindRequestFromUIThread(
+              static_cast<StoragePartitionImpl*>(host->GetStoragePartition()),
+              NativeFileSystemManagerImpl::BindingContext(origin, host->GetID(),
+                                                          MSG_ROUTING_NONE),
+              std::move(request));
         }));
   }
   parameterized_binder_registry_.AddInterface(
diff --git a/content/browser/service_worker/service_worker_request_handler_unittest.cc b/content/browser/service_worker/service_worker_request_handler_unittest.cc
index 386bfc54..481d1019 100644
--- a/content/browser/service_worker/service_worker_request_handler_unittest.cc
+++ b/content/browser/service_worker/service_worker_request_handler_unittest.cc
@@ -84,7 +84,8 @@
     begin_params->request_context_type =
         blink::mojom::RequestContextType::HYPERLINK;
     NavigationRequestInfo request_info(
-        common_params, std::move(begin_params), gurl, url::Origin::Create(gurl),
+        common_params, std::move(begin_params), gurl,
+        net::NetworkIsolationKey(url::Origin::Create(gurl)),
         true /* is_main_frame */, false /* parent_is_main_frame */,
         true /* are_ancestors_secure */, -1 /* frame_tree_node_id */,
         false /* is_for_guests_only */, false /* report_raw_headers */,
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index ed5cc90..186174c5 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -1680,18 +1680,6 @@
   special_storage_policy_ = special_storage_policy;
 }
 
-void StoragePartitionImpl::ShutdownBackgroundSyncContextForTesting() {
-  if (GetBackgroundSyncContext())
-    GetBackgroundSyncContext()->Shutdown();
-}
-
-void StoragePartitionImpl::OverrideBackgroundSyncContextForTesting(
-    BackgroundSyncContextImpl* background_sync_context) {
-  DCHECK(!GetBackgroundSyncContext() ||
-         !GetBackgroundSyncContext()->background_sync_manager());
-  background_sync_context_ = background_sync_context;
-}
-
 void StoragePartitionImpl::SetURLRequestContext(
     net::URLRequestContextGetter* url_request_context) {
   url_request_context_ = url_request_context;
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h
index 68e591f..10a6041e 100644
--- a/content/browser/storage_partition_impl.h
+++ b/content/browser/storage_partition_impl.h
@@ -85,9 +85,6 @@
       storage::QuotaManager* quota_manager);
   void OverrideSpecialStoragePolicyForTesting(
       storage::SpecialStoragePolicy* special_storage_policy);
-  void ShutdownBackgroundSyncContextForTesting();
-  void OverrideBackgroundSyncContextForTesting(
-      BackgroundSyncContextImpl* background_sync_context);
 
   // StoragePartition interface.
   base::FilePath GetPath() override;
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index 079285e2..b85e0c98 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -955,6 +955,15 @@
       return http_response;
     }
 
+    // Make the document resource cacheable.
+    if (absolute_url.path() == "/title1.html") {
+      auto http_response =
+          std::make_unique<net::test_server::BasicHttpResponse>();
+      http_response->set_code(net::HTTP_OK);
+      http_response->AddCustomHeader("Cache-Control", "max-age=100000");
+      return http_response;
+    }
+
     // A worker that loads a nested /worker.js on an origin provided as a query
     // param.
     if (absolute_url.path() == "/embedding_worker.js") {
@@ -1080,6 +1089,42 @@
     return (*observer.FindResource(resource))->was_cached;
   }
 
+  // Navigates to |url| and returns if the navigation resource was fetched from
+  // the cache or not.
+  bool NavigationResourceCached(const GURL& url,
+                                const GURL& sub_frame,
+                                bool subframe_navigation_resource_cached) {
+    // Do a cross-process navigation to clear the in-memory cache.
+    // We assume that we don't start this call from "chrome://gpu", as
+    // otherwise it won't be a cross-process navigation. We are relying
+    // on this navigation to discard the old process.
+    EXPECT_TRUE(NavigateToURL(shell(), GetWebUIURL("gpu")));
+
+    // Observe network requests.
+    ResourceLoadObserver observer(shell());
+
+    NavigateToURL(shell(), url);
+
+    RenderFrameHostImpl* main_frame = static_cast<RenderFrameHostImpl*>(
+        shell()->web_contents()->GetMainFrame());
+
+    GURL main_url = main_frame->frame_tree_node()->current_url();
+    observer.WaitForResourceCompletion(main_url);
+
+    if (sub_frame.is_valid()) {
+      EXPECT_EQ(1U, main_frame->frame_tree_node()->child_count());
+      NavigateFrameToURL(main_frame->frame_tree_node()->child_at(0), sub_frame);
+      EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
+      GURL sub_frame_url =
+          main_frame->frame_tree_node()->child_at(0)->current_url();
+      observer.WaitForResourceCompletion(sub_frame_url);
+      EXPECT_EQ(subframe_navigation_resource_cached,
+                (*observer.FindResource(sub_frame_url))->was_cached);
+    }
+
+    return (*observer.FindResource(main_url))->was_cached;
+  }
+
   GURL GenURL(const std::string& host, const std::string& path) {
     return embedded_test_server()->GetURL(host, path);
   }
@@ -1147,6 +1192,10 @@
   // the resource shouldn't be cached because now we're on d.com.
   EXPECT_FALSE(TestResourceLoad(GenURL("a.com", "/redirect_to_d"), GURL()));
 
+  // Navigate to d.com directly. The main resource should be cached due to the
+  // earlier navigation.
+  EXPECT_TRUE(TestResourceLoad(GenURL("d.com", "/title1.html"), GURL()));
+
   // Load the resource from a same-origin iframe on a page where it's already
   // cached. It should still be cached.
   EXPECT_TRUE(TestResourceLoad(GenURL("a.com", "/title1.html"),
@@ -1207,6 +1256,39 @@
 }
 
 IN_PROC_BROWSER_TEST_P(WebContentsSplitCacheBrowserTestEnabled,
+                       NavigationResources) {
+  // Navigate for the first time, and it's not cached.
+  EXPECT_FALSE(
+      NavigationResourceCached(GenURL("a.com", "/title1.html"), GURL(), false));
+
+  // The second time, it's cached.
+  EXPECT_TRUE(
+      NavigationResourceCached(GenURL("a.com", "/title1.html"), GURL(), false));
+
+  // Navigate to a.com/redirect_to_d which redirects to d.com/title1.html.
+  EXPECT_FALSE(NavigationResourceCached(GenURL("a.com", "/redirect_to_d"),
+                                        GURL(), false));
+
+  // Navigate to d.com directly. The main resource should be cached due to the
+  // earlier redirected navigation.
+  EXPECT_TRUE(
+      NavigationResourceCached(GenURL("d.com", "/title1.html"), GURL(), false));
+
+  // Navigate to a subframe with the same top frame origin as in an earlier
+  // navigation and same url as already navigated to earlier in a main frame
+  // navigation. It should be a cache hit for the subframe resource.
+  EXPECT_FALSE(NavigationResourceCached(
+      GenURL("a.com", "/navigation_controller/page_with_iframe.html"),
+      GenURL("a.com", "/title1.html"), true));
+
+  // Navigate to the same subframe document from a different top frame top frame
+  // origin. It should be a cache miss.
+  EXPECT_FALSE(NavigationResourceCached(
+      GenURL("b.com", "/navigation_controller/page_with_iframe.html"),
+      GenURL("a.com", "/title1.html"), false));
+}
+
+IN_PROC_BROWSER_TEST_P(WebContentsSplitCacheBrowserTestEnabled,
                        SplitCacheDedicatedWorkers) {
   // Load 3p.com/script from a.com's worker. The first time it's loaded from the
   // network and the second it's cached.
diff --git a/content/browser/webui/web_ui_mojo_browsertest.cc b/content/browser/webui/web_ui_mojo_browsertest.cc
index c7f7a27e..fb06c33 100644
--- a/content/browser/webui/web_ui_mojo_browsertest.cc
+++ b/content/browser/webui/web_ui_mojo_browsertest.cc
@@ -303,28 +303,59 @@
   if (!IsGeneratedResourceAvailable(
           "content/test/data/web_ui_test_mojo_bindings.mojom-lite.js"))
     return;
-
-  g_got_message = false;
-  base::RunLoop run_loop;
-  factory()->set_run_loop(&run_loop);
   GURL test_url(GetWebUIURL("mojo-web-ui/web_ui_mojo.html?ping"));
-  NavigateToURL(shell(), test_url);
-  // RunLoop is quit when message received from page.
-  run_loop.Run();
-  EXPECT_TRUE(g_got_message);
 
-  // Check that a second render frame in the same renderer process works
-  // correctly.
-  Shell* other_shell = CreateBrowser();
-  g_got_message = false;
-  base::RunLoop other_run_loop;
-  factory()->set_run_loop(&other_run_loop);
-  NavigateToURL(other_shell, test_url);
-  // RunLoop is quit when message received from page.
-  other_run_loop.Run();
-  EXPECT_TRUE(g_got_message);
-  EXPECT_EQ(shell()->web_contents()->GetMainFrame()->GetProcess(),
-            other_shell->web_contents()->GetMainFrame()->GetProcess());
+  {
+    g_got_message = false;
+    base::RunLoop run_loop;
+    factory()->set_run_loop(&run_loop);
+    NavigateToURL(shell(), test_url);
+    // RunLoop is quit when message received from page.
+    run_loop.Run();
+    EXPECT_TRUE(g_got_message);
+  }
+
+  {
+    // Check that a second shell works correctly.
+    Shell* other_shell = CreateBrowser();
+    g_got_message = false;
+    base::RunLoop other_run_loop;
+    factory()->set_run_loop(&other_run_loop);
+    NavigateToURL(other_shell, test_url);
+    // RunLoop is quit when message received from page.
+    other_run_loop.Run();
+    EXPECT_TRUE(g_got_message);
+
+    // We expect two independent chrome://foo tabs/shells to use a separate
+    // process.
+    EXPECT_NE(shell()->web_contents()->GetMainFrame()->GetProcess(),
+              other_shell->web_contents()->GetMainFrame()->GetProcess());
+
+    // Close the second shell and wait until its process exits.
+    RenderProcessHostWatcher process_watcher(
+        other_shell->web_contents()->GetMainFrame()->GetProcess(),
+        RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
+    other_shell->Close();
+    process_watcher.Wait();
+  }
+
+  {
+    // Check that a third shell works correctly, even if we force it to share a
+    // process with the first shell, by forcing an artificially low process
+    // limit.
+    RenderProcessHost::SetMaxRendererProcessCount(1);
+
+    Shell* other_shell = CreateBrowser();
+    g_got_message = false;
+    base::RunLoop other_run_loop;
+    factory()->set_run_loop(&other_run_loop);
+    NavigateToURL(other_shell, test_url);
+    // RunLoop is quit when message received from page.
+    other_run_loop.Run();
+    EXPECT_TRUE(g_got_message);
+    EXPECT_EQ(shell()->web_contents()->GetMainFrame()->GetProcess(),
+              other_shell->web_contents()->GetMainFrame()->GetProcess());
+  }
 }
 
 // Disabled due to flakiness: crbug.com/860385.
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index b4ed1fa..3bcd0517 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -543,7 +543,7 @@
       "sandbox_support_mac.mojom",
       "web_contents_ns_view_bridge.mojom",
     ]
-    public_deps += [ "//ui/display/mojo:interfaces" ]
+    public_deps += [ "//ui/display/mojom" ]
   }
 
   overridden_deps = [ "//third_party/blink/public/mojom:mojom_core" ]
diff --git a/content/common/render_widget_host_ns_view.mojom b/content/common/render_widget_host_ns_view.mojom
index 1a11dd4..9cb2c59 100644
--- a/content/common/render_widget_host_ns_view.mojom
+++ b/content/common/render_widget_host_ns_view.mojom
@@ -8,7 +8,7 @@
 import "content/common/input/input_handler.mojom";
 import "mojo/public/mojom/base/string16.mojom";
 import "ui/base/ime/mojo/ime_types.mojom";
-import "ui/display/mojo/display.mojom";
+import "ui/display/mojom/display.mojom";
 import "ui/events/mojo/event.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
 import "ui/gfx/mojo/ca_layer_params.mojom";
diff --git a/content/public/browser/background_sync_context.h b/content/public/browser/background_sync_context.h
index d2237b8..0273ceb 100644
--- a/content/public/browser/background_sync_context.h
+++ b/content/public/browser/background_sync_context.h
@@ -29,10 +29,9 @@
 class CONTENT_EXPORT BackgroundSyncContext {
  public:
   // Gets the soonest time delta from now, when the browser should be woken up
-  // to fire Background Sync events of |sync_type|, across all storage
-  // partitions in |browser_context|, and invokes |callback| with it.
+  // to fire any Background Sync events, across all storage partitions in
+  // |browser_context|, and invokes |callback| with it.
   static void GetSoonestWakeupDeltaAcrossPartitions(
-      blink::mojom::BackgroundSyncType sync_type,
       BrowserContext* browser_context,
       base::OnceCallback<void(base::TimeDelta)> callback);
 
@@ -59,8 +58,6 @@
   // Gets the soonest time delta from now, when the browser should be woken up
   // to fire any Background Sync events. Calls |callback| with this value.
   virtual void GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType sync_type,
-      base::Time last_browser_wakeup_for_periodic_sync,
       base::OnceCallback<void(base::TimeDelta)> callback) = 0;
 
  protected:
diff --git a/content/public/browser/background_sync_controller.h b/content/public/browser/background_sync_controller.h
index 1a67cdd..c402b7f2 100644
--- a/content/public/browser/background_sync_controller.h
+++ b/content/public/browser/background_sync_controller.h
@@ -57,10 +57,8 @@
       int max_attempts) {}
 
   // Calculates the soonest wakeup delta across all storage partitions and
-  // schedules a background task to wake up the browser to process
-  // Background Sync registrations.
-  virtual void ScheduleBrowserWakeUp(
-      blink::mojom::BackgroundSyncType sync_type) {}
+  // schedules a background task to wake up the browser.
+  virtual void RunInBackground() {}
 
   // Calculates the delay after which the next sync event should be fired
   // for a BackgroundSync registration. The delay is based on the |sync_type|.
diff --git a/content/public/browser/native_file_system_entry_factory.h b/content/public/browser/native_file_system_entry_factory.h
index 8ccb498..38fcc33b9 100644
--- a/content/public/browser/native_file_system_entry_factory.h
+++ b/content/public/browser/native_file_system_entry_factory.h
@@ -9,6 +9,7 @@
 #include "base/memory/ref_counted.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/browser_thread.h"
+#include "ipc/ipc_message.h"
 #include "third_party/blink/public/mojom/native_file_system/native_file_system_directory_handle.mojom-forward.h"
 #include "url/origin.h"
 
@@ -19,12 +20,17 @@
     : public base::RefCountedThreadSafe<NativeFileSystemEntryFactory,
                                         BrowserThread::DeleteOnIOThread> {
  public:
+  // Context from which a created handle is going to be used. This is used for
+  // security and permission checks. Pass in MSG_ROUTING_NONE as frame_id if
+  // the context is a worker, otherwise use the routing id of the relevant
+  // RenderFrameHost.
   struct CONTENT_EXPORT BindingContext {
     BindingContext(const url::Origin& origin, int process_id, int frame_id)
         : origin(origin), process_id(process_id), frame_id(frame_id) {}
     url::Origin origin;
     int process_id;
     int frame_id;
+    bool is_worker() const { return frame_id == MSG_ROUTING_NONE; }
   };
 
   // Creates a new NativeFileSystemEntryPtr from the path to a file. Assumes the
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc
index 3915614..6e1fea1 100644
--- a/content/public/test/render_view_test.cc
+++ b/content/public/test/render_view_test.cc
@@ -31,6 +31,7 @@
 #include "content/public/renderer/render_view_visitor.h"
 #include "content/public/test/frame_load_waiter.h"
 #include "content/renderer/history_serialization.h"
+#include "content/renderer/loader/resource_dispatcher.h"
 #include "content/renderer/render_thread_impl.h"
 #include "content/renderer/render_view_impl.h"
 #include "content/renderer/renderer_blink_platform_impl.h"
@@ -48,6 +49,7 @@
 #include "third_party/blink/public/platform/web_gesture_event.h"
 #include "third_party/blink/public/platform/web_input_event.h"
 #include "third_party/blink/public/platform/web_mouse_event.h"
+#include "third_party/blink/public/platform/web_url_loader_client.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/public/web/blink.h"
 #include "third_party/blink/public/web/web_document.h"
@@ -103,6 +105,70 @@
   DISALLOW_COPY_AND_ASSIGN(CloseMessageSendingRenderViewVisitor);
 };
 
+class FakeWebURLLoader : public blink::WebURLLoader {
+ public:
+  FakeWebURLLoader(
+      std::unique_ptr<blink::scheduler::WebResourceLoadingTaskRunnerHandle>
+          task_runner_handle)
+      : task_runner_handle_(std::move(task_runner_handle)) {}
+
+  void LoadSynchronously(const WebURLRequest& request,
+                         blink::WebURLLoaderClient* client,
+                         blink::WebURLResponse&,
+                         base::Optional<blink::WebURLError>&,
+                         blink::WebData&,
+                         int64_t&,
+                         int64_t&,
+                         blink::WebBlobInfo&) override {
+    client->DidFail(blink::WebURLError(kFailureReason, request.Url()), 0, 0, 0);
+  }
+
+  void LoadAsynchronously(const WebURLRequest& request,
+                          blink::WebURLLoaderClient* client) override {
+    DCHECK(task_runner_handle_);
+    async_client_ = client;
+    task_runner_handle_->GetTaskRunner()->PostTask(
+        FROM_HERE,
+        base::BindOnce(&FakeWebURLLoader::DidFail, weak_factory_.GetWeakPtr(),
+                       blink::WebURLError(kFailureReason, request.Url()), 0, 0,
+                       0));
+  }
+
+  void SetDefersLoading(bool) override {}
+  void DidChangePriority(WebURLRequest::Priority, int) override {}
+  scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override {
+    return nullptr;
+  }
+
+  void DidFail(const blink::WebURLError& error,
+               int64_t total_encoded_data_length,
+               int64_t total_encoded_body_length,
+               int64_t total_decoded_body_length) {
+    DCHECK(async_client_);
+    async_client_->DidFail(error, total_encoded_data_length,
+                           total_encoded_body_length,
+                           total_decoded_body_length);
+  }
+
+ private:
+  static const int kFailureReason = net::ERR_FAILED;
+  std::unique_ptr<blink::scheduler::WebResourceLoadingTaskRunnerHandle>
+      task_runner_handle_;
+  blink::WebURLLoaderClient* async_client_ = nullptr;
+
+  base::WeakPtrFactory<FakeWebURLLoader> weak_factory_{this};
+};
+
+class FakeWebURLLoaderFactory : public blink::WebURLLoaderFactory {
+ public:
+  std::unique_ptr<blink::WebURLLoader> CreateURLLoader(
+      const WebURLRequest&,
+      std::unique_ptr<blink::scheduler::WebResourceLoadingTaskRunnerHandle>
+          task_runner_handle) override {
+    return std::make_unique<FakeWebURLLoader>(std::move(task_runner_handle));
+  }
+};
+
 // Converts |ascii_character| into |key_code| and returns true on success.
 // Handles only the characters needed by tests.
 bool GetWindowsKeyCode(char ascii_character, int* key_code) {
@@ -747,4 +813,11 @@
       blink::WebWidget::LifecycleUpdateReason::kTest);
 }
 
+void RenderViewTest::CreateFakeWebURLLoaderFactory() {
+  auto* frame_impl = static_cast<RenderViewImpl*>(view_)->GetMainRenderFrame();
+  DCHECK(frame_impl);
+  frame_impl->SetWebURLLoaderFactoryOverrideForTest(
+      std::make_unique<FakeWebURLLoaderFactory>());
+}
+
 }  // namespace content
diff --git a/content/public/test/render_view_test.h b/content/public/test/render_view_test.h
index 7c4f3d1..9ae805d 100644
--- a/content/public/test/render_view_test.h
+++ b/content/public/test/render_view_test.h
@@ -202,6 +202,9 @@
 
   void TearDown() override;
 
+  // Install a fake URL loader factory for the RenderFrameImpl.
+  void CreateFakeWebURLLoaderFactory();
+
   base::test::ScopedTaskEnvironment scoped_task_environment_;
 
   std::unique_ptr<CompositorDependencies> compositor_deps_;
diff --git a/content/renderer/loader/web_url_loader_impl.cc b/content/renderer/loader/web_url_loader_impl.cc
index 5cda56b..176343f 100644
--- a/content/renderer/loader/web_url_loader_impl.cc
+++ b/content/renderer/loader/web_url_loader_impl.cc
@@ -352,11 +352,6 @@
 
 WebURLLoaderFactoryImpl::~WebURLLoaderFactoryImpl() = default;
 
-std::unique_ptr<WebURLLoaderFactoryImpl>
-WebURLLoaderFactoryImpl::CreateTestOnlyFactory() {
-  return std::make_unique<WebURLLoaderFactoryImpl>(nullptr, nullptr);
-}
-
 std::unique_ptr<blink::WebURLLoader> WebURLLoaderFactoryImpl::CreateURLLoader(
     const blink::WebURLRequest& request,
     std::unique_ptr<WebResourceLoadingTaskRunnerHandle> task_runner_handle) {
diff --git a/content/renderer/loader/web_url_loader_impl.h b/content/renderer/loader/web_url_loader_impl.h
index 9ce10668..c5b97159 100644
--- a/content/renderer/loader/web_url_loader_impl.h
+++ b/content/renderer/loader/web_url_loader_impl.h
@@ -35,9 +35,6 @@
       scoped_refptr<network::SharedURLLoaderFactory> loader_factory);
   ~WebURLLoaderFactoryImpl() override;
 
-  // Creates a test-only factory which can be used only for data URLs.
-  static std::unique_ptr<WebURLLoaderFactoryImpl> CreateTestOnlyFactory();
-
   std::unique_ptr<blink::WebURLLoader> CreateURLLoader(
       const blink::WebURLRequest& request,
       std::unique_ptr<blink::scheduler::WebResourceLoadingTaskRunnerHandle>
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 13bedee..dfac9d0 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -7402,8 +7402,9 @@
 RenderFrameImpl::CreateURLLoaderFactory() {
   if (!RenderThreadImpl::current()) {
     // Some tests (e.g. RenderViewTests) do not have RenderThreadImpl,
-    // use the platform's default WebURLLoaderFactoryImpl for them.
-    return WebURLLoaderFactoryImpl::CreateTestOnlyFactory();
+    // and must create a factory override instead.
+    DCHECK(web_url_loader_factory_override_for_test_);
+    return std::move(web_url_loader_factory_override_for_test_);
   }
   return std::make_unique<FrameURLLoaderFactory>(weak_factory_.GetWeakPtr());
 }
@@ -7703,4 +7704,9 @@
   frame_->AddMessageToConsole(wcm, discard_duplicates);
 }
 
+void RenderFrameImpl::SetWebURLLoaderFactoryOverrideForTest(
+    std::unique_ptr<blink::WebURLLoaderFactory> factory) {
+  web_url_loader_factory_override_for_test_ = std::move(factory);
+}
+
 }  // namespace content
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index dc8171af..9e059c3 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -997,6 +997,11 @@
   void SetDocumentInterfaceBrokerForTesting(
       blink::mojom::DocumentInterfaceBrokerPtr test_broker);
 
+  // Used in tests to install a fake WebURLLoaderFactory via
+  // RenderViewTest::CreateFakeWebURLLoaderFactory().
+  void SetWebURLLoaderFactoryOverrideForTest(
+      std::unique_ptr<blink::WebURLLoaderFactory> factory);
+
  protected:
   explicit RenderFrameImpl(CreateParams params);
 
@@ -1773,6 +1778,9 @@
   class MHTMLBodyLoaderClient;
   std::unique_ptr<MHTMLBodyLoaderClient> mhtml_body_loader_client_;
 
+  std::unique_ptr<blink::WebURLLoaderFactory>
+      web_url_loader_factory_override_for_test_;
+
   base::WeakPtrFactory<RenderFrameImpl> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(RenderFrameImpl);
diff --git a/content/shell/renderer/web_test/blink_test_runner.cc b/content/shell/renderer/web_test/blink_test_runner.cc
index dabd9e4..0cd46067 100644
--- a/content/shell/renderer/web_test/blink_test_runner.cc
+++ b/content/shell/renderer/web_test/blink_test_runner.cc
@@ -415,8 +415,7 @@
   if (!interfaces->TestIsRunning())
     return;
 
-  RenderThread::Get()->Send(
-      new WebTestHostMsg_WebTestRuntimeFlagsChanged(changed_values));
+  Send(new WebTestHostMsg_WebTestRuntimeFlagsChanged(changed_values));
 }
 
 void BlinkTestRunner::TestFinished() {
@@ -431,8 +430,7 @@
   // If we're not in the main frame, then ask the browser to redirect the call
   // to the main frame instead.
   if (!is_main_window_ || !render_view()->GetMainRenderFrame()) {
-    RenderThread::Get()->Send(
-        new WebTestHostMsg_TestFinishedInSecondaryRenderer());
+    Send(new WebTestHostMsg_TestFinishedInSecondaryRenderer());
     return;
   }
 
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index 30b7f7e..ff3023f 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -175,9 +175,8 @@
 # Mark all webview tests as RetryOnFailure due to Nexus 5x driver bug.
 crbug.com/950932 [ android-webview-instrumentation qualcomm-adreno-(tm)-418 ] * [ RetryOnFailure ]
 
-# Failing on Nexus 5
-crbug.com/957714 [ android no-skia-renderer qualcomm-adreno-(tm)-330 ] Pixel_Canvas2DRedBox [ Failure ]
-crbug.com/900706 [ android qualcomm-adreno-(tm)-330 ] Pixel_CanvasLowLatency2D [ Failure ]
+# Producing black images on Nexus 5Xs in Android Webview.
+crbug.com/984352 [ android android-webview-instrumentation qualcomm-adreno-(tm)-418 ] Pixel_CanvasLowLatency2D [ Failure ]
 
 # Failing on Pixel 2 FYI.
 crbug.com/966069 [ android qualcomm-adreno-(tm)-540 ] Pixel_CanvasLowLatency2D [ Failure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index 0be21e1..5451ec0 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -345,6 +345,9 @@
 crbug.com/483282 [ mac nvidia-0xfe9 ] deqp/functional/gles3/fboinvalidate/format_02.html [ Failure ]
 crbug.com/483282 [ mac nvidia-0xfe9 ] deqp/functional/gles3/negativeshaderapi.html [ Failure ]
 crbug.com/483282 [ mac nvidia-0xfe9 ] deqp/functional/gles3/vertexarrays/multiple_attributes.output.html [ RetryOnFailure ]
+crbug.com/984588 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_06.html [ Failure ]
+crbug.com/984588 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_21.html [ Failure ]
+crbug.com/984588 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_26.html [ Failure ]
 crbug.com/654187 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_28.html [ Failure ]
 crbug.com/654187 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_30.html [ Failure ]
 crbug.com/654187 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_31.html [ Failure ]
diff --git a/content/test/mock_background_sync_controller.cc b/content/test/mock_background_sync_controller.cc
index 6e27341..e722604 100644
--- a/content/test/mock_background_sync_controller.cc
+++ b/content/test/mock_background_sync_controller.cc
@@ -14,13 +14,8 @@
   registration_origin_ = origin;
 }
 
-void MockBackgroundSyncController::ScheduleBrowserWakeUp(
-    blink::mojom::BackgroundSyncType sync_type) {
-  if (sync_type == blink::mojom::BackgroundSyncType::PERIODIC) {
-    run_in_background_for_periodic_sync_count_ += 1;
-    return;
-  }
-  run_in_background_for_one_shot_sync_count_ += 1;
+void MockBackgroundSyncController::RunInBackground() {
+  run_in_background_count_ += 1;
 }
 
 void MockBackgroundSyncController::GetParameterOverrides(
diff --git a/content/test/mock_background_sync_controller.h b/content/test/mock_background_sync_controller.h
index 3300aa3..7f87e00 100644
--- a/content/test/mock_background_sync_controller.h
+++ b/content/test/mock_background_sync_controller.h
@@ -27,8 +27,7 @@
   void NotifyBackgroundSyncRegistered(const url::Origin& origin,
                                       bool can_fire,
                                       bool is_reregistered) override;
-  void ScheduleBrowserWakeUp(
-      blink::mojom::BackgroundSyncType sync_type) override;
+  void RunInBackground() override;
   void GetParameterOverrides(BackgroundSyncParameters* parameters) override;
   base::TimeDelta GetNextEventDelay(
       const url::Origin& origin,
@@ -43,12 +42,7 @@
   const url::Origin& registration_origin() const {
     return registration_origin_;
   }
-  int run_in_background_count() const {
-    return run_in_background_for_one_shot_sync_count_;
-  }
-  int run_in_background_periodic_sync_count() const {
-    return run_in_background_for_periodic_sync_count_;
-  }
+  int run_in_background_count() const { return run_in_background_count_; }
   BackgroundSyncParameters* background_sync_parameters() {
     return &background_sync_parameters_;
   }
@@ -57,8 +51,7 @@
   int registration_count_ = 0;
   url::Origin registration_origin_;
 
-  int run_in_background_for_one_shot_sync_count_ = 0;
-  int run_in_background_for_periodic_sync_count_ = 0;
+  int run_in_background_count_ = 0;
   BackgroundSyncParameters background_sync_parameters_;
 
   DISALLOW_COPY_AND_ASSIGN(MockBackgroundSyncController);
diff --git a/content/test/test_background_sync_manager.cc b/content/test/test_background_sync_manager.cc
index c360281c..67b30bd 100644
--- a/content/test/test_background_sync_manager.cc
+++ b/content/test/test_background_sync_manager.cc
@@ -31,6 +31,10 @@
   std::move(continuation_).Run();
 }
 
+void TestBackgroundSyncManager::ClearDelayedTask() {
+  delayed_task_.Reset();
+}
+
 void TestBackgroundSyncManager::StoreDataInBackend(
     int64_t sw_registration_id,
     const url::Origin& origin,
@@ -94,13 +98,10 @@
   dispatch_periodic_sync_callback_.Run(active_version, std::move(callback));
 }
 
-void TestBackgroundSyncManager::ScheduleDelayedTask(
-    blink::mojom::BackgroundSyncType sync_type,
-    base::TimeDelta delay) {
-  if (sync_type == blink::mojom::BackgroundSyncType::ONE_SHOT)
-    delayed_one_shot_sync_task_delta_ = delay;
-  else
-    delayed_periodic_sync_task_delta_ = delay;
+void TestBackgroundSyncManager::ScheduleDelayedTask(base::OnceClosure callback,
+                                                    base::TimeDelta delay) {
+  delayed_task_ = std::move(callback);
+  delayed_task_delta_ = delay;
 }
 
 void TestBackgroundSyncManager::HasMainFrameProviderHost(
@@ -126,15 +127,11 @@
 }
 
 base::TimeDelta TestBackgroundSyncManager::GetSoonestWakeupDelta(
-    blink::mojom::BackgroundSyncType sync_type,
-    base::Time last_browser_wakeup_for_periodic_sync) {
+    blink::mojom::BackgroundSyncType sync_type) {
   base::TimeDelta soonest_wakeup_delta =
-      BackgroundSyncManager::GetSoonestWakeupDelta(
-          sync_type, last_browser_wakeup_for_periodic_sync);
+      BackgroundSyncManager::GetSoonestWakeupDelta(sync_type);
   if (sync_type == blink::mojom::BackgroundSyncType::ONE_SHOT)
-    soonest_one_shot_sync_wakeup_delta_ = soonest_wakeup_delta;
-  else
-    soonest_periodic_sync_wakeup_delta_ = soonest_wakeup_delta;
+    soonest_one_shot_wakeup_delta_ = soonest_wakeup_delta;
   return soonest_wakeup_delta;
 }
 
diff --git a/content/test/test_background_sync_manager.h b/content/test/test_background_sync_manager.h
index 519b4cb..58f5217 100644
--- a/content/test/test_background_sync_manager.h
+++ b/content/test/test_background_sync_manager.h
@@ -83,45 +83,22 @@
     has_main_frame_provider_host_ = value;
   }
 
-  bool IsDelayedTaskScheduledOneShotSync() const {
-    return !delayed_one_shot_sync_task_.callback().is_null();
-  }
-  bool IsDelayedTaskScheduledPeriodicSync() const {
-    return !delayed_periodic_sync_task_.callback().is_null();
-  }
-  void RunOneShotSyncDelayedTask() {
-    std::move(delayed_one_shot_sync_task_.callback()).Run();
-  }
-  void RunPeriodicSyncDelayedTask() {
-    std::move(delayed_periodic_sync_task_.callback()).Run();
-  }
+  bool IsDelayedTaskScheduled() const { return !delayed_task_.is_null(); }
+  void RunDelayedTask() { std::move(delayed_task_).Run(); }
 
   // Accessors to internal state
-  base::TimeDelta delayed_one_shot_sync_task_delta() const {
-    return delayed_one_shot_sync_task_delta_;
-  }
-  base::TimeDelta delayed_periodic_sync_task_delta() const {
-    return delayed_periodic_sync_task_delta_;
-  }
+  base::TimeDelta delayed_task_delta() const { return delayed_task_delta_; }
   bool last_chance() const { return last_chance_; }
   const BackgroundSyncParameters* background_sync_parameters() const {
     return parameters_.get();
   }
 
-  bool IsBrowserWakeupForOneShotSyncScheduled() const {
-    return !soonest_one_shot_sync_wakeup_delta_.is_max();
-  }
-
-  bool IsBrowserWakeupForPeriodicSyncScheduled() const {
-    return !soonest_periodic_sync_wakeup_delta_.is_max();
+  bool IsBrowserWakeupScheduled() const {
+    return !soonest_one_shot_wakeup_delta_.is_max();
   }
 
   bool EqualsSoonestOneShotWakeupDelta(base::TimeDelta compare_to) const {
-    return soonest_one_shot_sync_wakeup_delta_ == compare_to;
-  }
-
-  bool EqualsSoonestPeriodicSyncWakeupDelta(base::TimeDelta compare_to) const {
-    return soonest_periodic_sync_wakeup_delta_ == compare_to;
+    return soonest_one_shot_wakeup_delta_ == compare_to;
   }
 
   void DispatchPeriodicSyncEvent(
@@ -131,8 +108,7 @@
 
   // Override to allow the test to cache the result.
   base::TimeDelta GetSoonestWakeupDelta(
-      blink::mojom::BackgroundSyncType sync_type,
-      base::Time last_browser_wakeup_for_periodic_sync) override;
+      blink::mojom::BackgroundSyncType sync_type) override;
 
  protected:
   // Override to allow delays to be injected by tests.
@@ -159,7 +135,7 @@
 
   // Override to just store delayed task, and allow tests to control the clock
   // and when delayed tasks are executed.
-  void ScheduleDelayedTask(blink::mojom::BackgroundSyncType sync_type,
+  void ScheduleDelayedTask(base::OnceClosure callback,
                            base::TimeDelta delay) override;
 
   // Override to avoid actual check for main frame, instead return the value set
@@ -190,10 +166,9 @@
   base::OnceClosure continuation_;
   DispatchSyncCallback dispatch_sync_callback_;
   DispatchSyncCallback dispatch_periodic_sync_callback_;
-  base::TimeDelta delayed_one_shot_sync_task_delta_;
-  base::TimeDelta delayed_periodic_sync_task_delta_;
-  base::TimeDelta soonest_one_shot_sync_wakeup_delta_;
-  base::TimeDelta soonest_periodic_sync_wakeup_delta_;
+  base::OnceClosure delayed_task_;
+  base::TimeDelta delayed_task_delta_;
+  base::TimeDelta soonest_one_shot_wakeup_delta_;
 
   DISALLOW_COPY_AND_ASSIGN(TestBackgroundSyncManager);
 };
diff --git a/device/vr/public/mojom/BUILD.gn b/device/vr/public/mojom/BUILD.gn
index 1e1b080c..69db524 100644
--- a/device/vr/public/mojom/BUILD.gn
+++ b/device/vr/public/mojom/BUILD.gn
@@ -18,7 +18,7 @@
     "//device/gamepad/public/mojom",
     "//gpu/ipc/common:interfaces",
     "//mojo/public/mojom/base",
-    "//ui/display/mojo:interfaces",
+    "//ui/display/mojom:mojom",
     "//ui/gfx/geometry/mojo",
     "//ui/gfx/mojo:mojo",
   ]
diff --git a/device/vr/public/mojom/vr_service.mojom b/device/vr/public/mojom/vr_service.mojom
index 70f7d3a..87edade 100644
--- a/device/vr/public/mojom/vr_service.mojom
+++ b/device/vr/public/mojom/vr_service.mojom
@@ -8,7 +8,7 @@
 import "mojo/public/mojom/base/time.mojom";
 import "gpu/ipc/common/mailbox_holder.mojom";
 import "gpu/ipc/common/sync_token.mojom";
-import "ui/display/mojo/display.mojom";
+import "ui/display/mojom/display.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
 import "ui/gfx/mojo/gpu_fence_handle.mojom";
 import "ui/gfx/mojo/transform.mojom";
diff --git a/docs/callback.md b/docs/callback.md
index 4d76389..99de0a1 100644
--- a/docs/callback.md
+++ b/docs/callback.md
@@ -355,13 +355,13 @@
 ```cpp
 class MyClass {
 public:
-  MyClass() : weak_factory_(this) {
+  MyClass() {
     weak_this_ = weak_factory_.GetWeakPtr();
   }
 private:
   base::WeakPtr<MyClass> weak_this_;
   // MyClass member variables go here.
-  base::WeakPtrFactory<MyClass> weak_factory_;
+  base::WeakPtrFactory<MyClass> weak_factory_{this};
 };
 ```
 
diff --git a/docs/threading_and_tasks.md b/docs/threading_and_tasks.md
index 5e85d2a..c393ab8 100644
--- a/docs/threading_and_tasks.md
+++ b/docs/threading_and_tasks.md
@@ -588,8 +588,6 @@
 
 class A {
  public:
-  A() : weak_ptr_factory_(this) {}
-
   void ComputeAndStore() {
     // Schedule a call to Compute() in a thread pool followed by
     // a call to A::Store() on the current sequence. The call to
@@ -604,7 +602,7 @@
   void Store(int value) { value_ = value; }
 
   int value_;
-  base::WeakPtrFactory<A> weak_ptr_factory_;
+  base::WeakPtrFactory<A> weak_ptr_factory_{this};
 };
 ```
 
diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_fetcher.cc
index 1e8b4e5..56e02351 100644
--- a/google_apis/gaia/gaia_auth_fetcher.cc
+++ b/google_apis/gaia/gaia_auth_fetcher.cc
@@ -47,6 +47,11 @@
 
 const size_t kMaxMessageSize = 1024 * 1024;  // 1MB
 
+constexpr char kBadAuthenticationError[] = "BadAuthentication";
+constexpr char kBadAuthenticationShortError[] = "badauth";
+constexpr char kServiceUnavailableError[] = "ServiceUnavailable";
+constexpr char kServiceUnavailableShortError[] = "ire";
+
 std::unique_ptr<const GaiaAuthConsumer::ClientOAuthResult>
 ExtractOAuth2TokenPairResponse(const std::string& data) {
   std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated(data);
@@ -175,10 +180,6 @@
 
 const char GaiaAuthFetcher::kOAuthLoginFormat[] = "service=%s&source=%s";
 
-const char GaiaAuthFetcher::kBadAuthenticationError[] = "BadAuthentication";
-// static
-const char GaiaAuthFetcher::kServiceUnavailableError[] =
-    "ServiceUnavailable";
 // static
 const char GaiaAuthFetcher::kErrorParam[] = "Error";
 // static
@@ -871,13 +872,15 @@
   ParseClientLoginFailure(data, &error, &url);
   DLOG(WARNING) << "ClientLogin failed with " << error;
 
-  if (error == kBadAuthenticationError) {
+  if (error == kBadAuthenticationShortError ||
+      error == kBadAuthenticationError) {
     return GoogleServiceAuthError(
         GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
             GoogleServiceAuthError::InvalidGaiaCredentialsReason::
                 CREDENTIALS_REJECTED_BY_SERVER));
   }
-  if (error == kServiceUnavailableError) {
+  if (error == kServiceUnavailableShortError ||
+      error == kServiceUnavailableError) {
     return GoogleServiceAuthError(
         GoogleServiceAuthError::SERVICE_UNAVAILABLE);
   }
diff --git a/google_apis/gaia/gaia_auth_fetcher.h b/google_apis/gaia/gaia_auth_fetcher.h
index 7cf915e..ffb869e 100644
--- a/google_apis/gaia/gaia_auth_fetcher.h
+++ b/google_apis/gaia/gaia_auth_fetcher.h
@@ -233,10 +233,6 @@
   static const char kOAuthLoginFormat[];
 
   // Constants for parsing ClientLogin errors.
-  static const char kBadAuthenticationError[];
-  static const char kBadAuthenticationErrorCode[];
-  static const char kServiceUnavailableError[];
-  static const char kServiceUnavailableErrorCode[];
   static const char kErrorParam[];
   static const char kErrorUrlParam[];
 
@@ -365,8 +361,10 @@
   friend class GaiaAuthFetcherTest;
   FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, CaptchaParse);
   FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, BadAuthenticationError);
+  FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, BadAuthenticationShortError);
   FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, IncomprehensibleError);
   FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, ServiceUnavailableError);
+  FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, ServiceUnavailableShortError);
   FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, CheckNormalErrorCode);
   FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, CheckTwoFactorResponse);
   FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, LoginNetFailure);
diff --git a/google_apis/gaia/gaia_auth_fetcher_unittest.cc b/google_apis/gaia/gaia_auth_fetcher_unittest.cc
index 579a52f6..b0163e7 100644
--- a/google_apis/gaia/gaia_auth_fetcher_unittest.cc
+++ b/google_apis/gaia/gaia_auth_fetcher_unittest.cc
@@ -246,6 +246,13 @@
   EXPECT_EQ(error.state(), GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
 }
 
+TEST_F(GaiaAuthFetcherTest, BadAuthenticationShortError) {
+  std::string data = "Error=badauth\n";
+  GoogleServiceAuthError error =
+      GaiaAuthFetcher::GenerateAuthError(data, net::OK);
+  EXPECT_EQ(error.state(), GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
+}
+
 TEST_F(GaiaAuthFetcherTest, IncomprehensibleError) {
   std::string data = "Error=Gobbledygook\n";
   GoogleServiceAuthError error =
@@ -260,6 +267,13 @@
   EXPECT_EQ(error.state(), GoogleServiceAuthError::SERVICE_UNAVAILABLE);
 }
 
+TEST_F(GaiaAuthFetcherTest, ServiceUnavailableShortError) {
+  std::string data = "Error=ire\n";
+  GoogleServiceAuthError error =
+      GaiaAuthFetcher::GenerateAuthError(data, net::OK);
+  EXPECT_EQ(error.state(), GoogleServiceAuthError::SERVICE_UNAVAILABLE);
+}
+
 TEST_F(GaiaAuthFetcherTest, StartAuthCodeForOAuth2TokenExchange_Success) {
   MockGaiaConsumer consumer;
   EXPECT_CALL(consumer, OnClientOAuthCode("test-code")).Times(0);
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg
index 56f1ce3..db38360 100644
--- a/infra/config/cr-buildbucket.cfg
+++ b/infra/config/cr-buildbucket.cfg
@@ -64,6 +64,11 @@
     identity: "findit-for-me@appspot.gserviceaccount.com"
   }
   acls {
+    # Allow Pinpoint to trigger builds for bisection.
+    role: SCHEDULER
+    group: "service-account-chromeperf"
+  }
+  acls {
     role: WRITER
     group: "service-account-chromium-tryserver"
   }
diff --git a/ios/chrome/browser/installation_notifier.mm b/ios/chrome/browser/installation_notifier.mm
index 6c08994..9541a5a 100644
--- a/ios/chrome/browser/installation_notifier.mm
+++ b/ios/chrome/browser/installation_notifier.mm
@@ -141,7 +141,6 @@
       [observers removeObject:weakReferenceToObserver];
       if ([observers count] == 0) {
         [_installedAppObservers removeObjectForKey:scheme];
-        UMA_HISTOGRAM_BOOLEAN("NativeAppLauncher.InstallationDetected", NO);
       }
     }
   }
@@ -190,7 +189,6 @@
       }
       if (![keysToDelete containsObject:scheme]) {
         [keysToDelete addObject:scheme];
-        UMA_HISTOGRAM_BOOLEAN("NativeAppLauncher.InstallationDetected", YES);
       }
     } else {
       keepPolling = YES;
diff --git a/ios/chrome/browser/installation_notifier_unittest.mm b/ios/chrome/browser/installation_notifier_unittest.mm
index 23784b0..669986f 100644
--- a/ios/chrome/browser/installation_notifier_unittest.mm
+++ b/ios/chrome/browser/installation_notifier_unittest.mm
@@ -9,7 +9,6 @@
 
 #include "base/ios/block_types.h"
 #include "base/message_loop/message_loop.h"
-#include "base/test/metrics/histogram_tester.h"
 #include "ios/web/public/test/test_web_thread.h"
 #include "net/base/backoff_entry.h"
 #include "testing/platform_test.h"
@@ -106,7 +105,6 @@
     application_ = OCMClassMock([UIApplication class]);
     OCMStub([application_ sharedApplication]).andReturn(application_);
     [installationNotifier_ setDispatcher:dispatcher_];
-    histogramTester_.reset(new base::HistogramTester());
   }
 
   ~InstallationNotifierTest() override {
@@ -114,15 +112,6 @@
     [application_ stopMocking];
   }
 
-  void VerifyHistogramValidity(int expectedYes, int expectedNo) {
-    histogramTester_->ExpectTotalCount("NativeAppLauncher.InstallationDetected",
-                                       expectedYes + expectedNo);
-    histogramTester_->ExpectBucketCount(
-        "NativeAppLauncher.InstallationDetected", YES, expectedYes);
-    histogramTester_->ExpectBucketCount(
-        "NativeAppLauncher.InstallationDetected", NO, expectedNo);
-  }
-
   void VerifyDelay(int pollingIteration) {
     double delayInMSec = [dispatcher_ lastDelayInNSec] / NSEC_PER_MSEC;
     double initialDelayInMSec =
@@ -143,7 +132,6 @@
   MockNotificationReceiver* notificationReceiver1_;
   MockNotificationReceiver* notificationReceiver2_;
   id application_;
-  std::unique_ptr<base::HistogramTester> histogramTester_;
 };
 
 TEST_F(InstallationNotifierTest, RegisterWithAppAlreadyInstalled) {
@@ -158,7 +146,6 @@
                               withSelector:@selector(receivedNotification)
                                  forScheme:@"foo-scheme"];
   EXPECT_EQ(2, [notificationReceiver1_ notificationCount]);
-  VerifyHistogramValidity(2, 0);
 }
 
 TEST_F(InstallationNotifierTest, RegisterWithAppInstalledAfterSomeTime) {
@@ -172,7 +159,6 @@
                               withSelector:@selector(receivedNotification)
                                  forScheme:@"foo-scheme"];
   EXPECT_EQ(1, [notificationReceiver1_ notificationCount]);
-  VerifyHistogramValidity(1, 0);
 }
 
 TEST_F(InstallationNotifierTest, RegisterForTwoInstallations) {
@@ -199,7 +185,6 @@
   [installationNotifier_ dispatchInstallationNotifierBlock];
   EXPECT_EQ(1, [notificationReceiver1_ notificationCount]);
   EXPECT_EQ(2, [notificationReceiver2_ notificationCount]);
-  VerifyHistogramValidity(2, 0);
 }
 
 TEST_F(InstallationNotifierTest, RegisterAndThenUnregister) {
@@ -214,7 +199,6 @@
                               withSelector:@selector(receivedNotification)
                                  forScheme:@"foo-scheme"];
   EXPECT_EQ(0, [notificationReceiver1_ notificationCount]);
-  VerifyHistogramValidity(0, 1);
 }
 
 TEST_F(InstallationNotifierTest, TestExponentialBackoff) {
@@ -258,7 +242,6 @@
       registerForInstallationNotifications:notificationReceiver1_
                               withSelector:@selector(receivedNotification)
                                  forScheme:@"foo-scheme"];
-  VerifyHistogramValidity(0, 2);
 }
 
 TEST_F(InstallationNotifierTest, TestThatEmptySchemeDoesntCrashChrome) {
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 4b522e27..9794fd3 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -64,8 +64,8 @@
   MOCK_METHOD1(OnVideoNaturalSizeChange, void(const gfx::Size&));
   MOCK_METHOD1(OnVideoOpacityChange, void(bool));
   MOCK_METHOD0(OnVideoAverageKeyframeDistanceUpdate, void());
-  MOCK_METHOD1(OnAudioDecoderChange, void(const std::string&));
-  MOCK_METHOD1(OnVideoDecoderChange, void(const std::string&));
+  MOCK_METHOD1(OnAudioDecoderChange, void(const PipelineDecoderInfo&));
+  MOCK_METHOD1(OnVideoDecoderChange, void(const PipelineDecoderInfo&));
   MOCK_METHOD1(OnRemotePlayStateChange, void(MediaStatus::State state));
 };
 
diff --git a/media/base/pipeline.h b/media/base/pipeline.h
index 3b40aee7..9352574 100644
--- a/media/base/pipeline.h
+++ b/media/base/pipeline.h
@@ -78,8 +78,8 @@
 
     // Executed whenever the underlying AudioDecoder or VideoDecoder changes
     // during playback.
-    virtual void OnAudioDecoderChange(const std::string& name) = 0;
-    virtual void OnVideoDecoderChange(const std::string& name) = 0;
+    virtual void OnAudioDecoderChange(const PipelineDecoderInfo& info) = 0;
+    virtual void OnVideoDecoderChange(const PipelineDecoderInfo& info) = 0;
   };
 
   virtual ~Pipeline() {}
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index be3b70c..5204727 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -666,19 +666,22 @@
   shared_state_.statistics.audio_memory_usage += stats.audio_memory_usage;
   shared_state_.statistics.video_memory_usage += stats.video_memory_usage;
 
-  if (!stats.audio_decoder_name.empty() &&
-      shared_state_.statistics.audio_decoder_name != stats.audio_decoder_name) {
-    shared_state_.statistics.audio_decoder_name = stats.audio_decoder_name;
+  if (!stats.audio_decoder_info.decoder_name.empty() &&
+      stats.audio_decoder_info != shared_state_.statistics.audio_decoder_info) {
+    shared_state_.statistics.audio_decoder_info.decoder_name =
+        stats.audio_decoder_info.decoder_name;
     main_task_runner_->PostTask(
         FROM_HERE, base::BindOnce(&PipelineImpl::OnAudioDecoderChange,
-                                  weak_pipeline_, stats.audio_decoder_name));
+                                  weak_pipeline_, stats.audio_decoder_info));
   }
-  if (!stats.video_decoder_name.empty() &&
-      shared_state_.statistics.video_decoder_name != stats.video_decoder_name) {
-    shared_state_.statistics.video_decoder_name = stats.video_decoder_name;
+
+  if (!stats.video_decoder_info.decoder_name.empty() &&
+      stats.video_decoder_info != shared_state_.statistics.video_decoder_info) {
+    shared_state_.statistics.video_decoder_info.decoder_name =
+        stats.video_decoder_info.decoder_name;
     main_task_runner_->PostTask(
         FROM_HERE, base::BindOnce(&PipelineImpl::OnVideoDecoderChange,
-                                  weak_pipeline_, stats.video_decoder_name));
+                                  weak_pipeline_, stats.video_decoder_info));
   }
 
   if (stats.video_frame_duration_average != kNoTimestamp) {
@@ -1370,22 +1373,22 @@
   client_->OnVideoAverageKeyframeDistanceUpdate();
 }
 
-void PipelineImpl::OnAudioDecoderChange(const std::string& name) {
+void PipelineImpl::OnAudioDecoderChange(const PipelineDecoderInfo& info) {
   DVLOG(2) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(IsRunning());
 
   DCHECK(client_);
-  client_->OnAudioDecoderChange(name);
+  client_->OnAudioDecoderChange(info);
 }
 
-void PipelineImpl::OnVideoDecoderChange(const std::string& name) {
+void PipelineImpl::OnVideoDecoderChange(const PipelineDecoderInfo& info) {
   DVLOG(2) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(IsRunning());
 
   DCHECK(client_);
-  client_->OnVideoDecoderChange(name);
+  client_->OnVideoDecoderChange(info);
 }
 
 void PipelineImpl::OnSeekDone(bool is_suspended) {
diff --git a/media/base/pipeline_impl.h b/media/base/pipeline_impl.h
index a9fa32d..66384b12 100644
--- a/media/base/pipeline_impl.h
+++ b/media/base/pipeline_impl.h
@@ -144,8 +144,8 @@
   void OnVideoNaturalSizeChange(const gfx::Size& size);
   void OnVideoOpacityChange(bool opaque);
   void OnVideoAverageKeyframeDistanceUpdate();
-  void OnAudioDecoderChange(const std::string& name);
-  void OnVideoDecoderChange(const std::string& name);
+  void OnAudioDecoderChange(const PipelineDecoderInfo& info);
+  void OnVideoDecoderChange(const PipelineDecoderInfo& info);
   void OnRemotePlayStateChange(MediaStatus::State state);
 
   // Task completion callbacks from RendererWrapper.
diff --git a/media/base/pipeline_status.cc b/media/base/pipeline_status.cc
index bd64b4e..ea7c663 100644
--- a/media/base/pipeline_status.cc
+++ b/media/base/pipeline_status.cc
@@ -25,8 +25,8 @@
              second.video_keyframe_distance_average &&
          first.video_frame_duration_average ==
              second.video_frame_duration_average &&
-         first.audio_decoder_name == second.audio_decoder_name &&
-         first.video_decoder_name == second.video_decoder_name;
+         first.video_decoder_info == second.video_decoder_info &&
+         first.audio_decoder_info == second.audio_decoder_info;
 }
 
 bool operator!=(const PipelineStatistics& first,
@@ -34,4 +34,17 @@
   return !(first == second);
 }
 
+bool operator==(const PipelineDecoderInfo& first,
+                const PipelineDecoderInfo& second) {
+  return first.decoder_name == second.decoder_name &&
+         first.is_platform_decoder == second.is_platform_decoder &&
+         first.is_decrypting_demuxer_stream ==
+             second.is_decrypting_demuxer_stream;
+}
+
+bool operator!=(const PipelineDecoderInfo& first,
+                const PipelineDecoderInfo& second) {
+  return !(first == second);
+}
+
 }  // namespace media
diff --git a/media/base/pipeline_status.h b/media/base/pipeline_status.h
index 11cc0e8c..d6eb5aa 100644
--- a/media/base/pipeline_status.h
+++ b/media/base/pipeline_status.h
@@ -60,6 +60,17 @@
 
 typedef base::Callback<void(PipelineStatus)> PipelineStatusCB;
 
+struct PipelineDecoderInfo {
+  bool is_platform_decoder = false;
+  bool is_decrypting_demuxer_stream = false;
+  std::string decoder_name;
+};
+
+MEDIA_EXPORT bool operator==(const PipelineDecoderInfo& first,
+                             const PipelineDecoderInfo& second);
+MEDIA_EXPORT bool operator!=(const PipelineDecoderInfo& first,
+                             const PipelineDecoderInfo& second);
+
 struct MEDIA_EXPORT PipelineStatistics {
   PipelineStatistics();
   PipelineStatistics(const PipelineStatistics& other);
@@ -79,11 +90,10 @@
   // NOTE: frame duration should reflect changes to playback rate.
   base::TimeDelta video_frame_duration_average = kNoTimestamp;
 
-  // Name of the audio or video decoder (if present). Note: Keep these fields at
-  // the end of the structure, if you move them you need to also update the test
-  // ProtoUtilsTest::PipelineStatisticsConversion.
-  std::string video_decoder_name;
-  std::string audio_decoder_name;
+  // Note: Keep these fields at the end of the structure, if you move them you
+  // need to also update the test ProtoUtilsTest::PipelineStatisticsConversion.
+  PipelineDecoderInfo audio_decoder_info;
+  PipelineDecoderInfo video_decoder_info;
 
   // NOTE: always update operator== implementation in pipeline_status.cc when
   // adding a field to this struct. Leave this comment at the end.
diff --git a/media/base/win/d3d11_mocks.cc b/media/base/win/d3d11_mocks.cc
index bfaf6e5..4dddc97 100644
--- a/media/base/win/d3d11_mocks.cc
+++ b/media/base/win/d3d11_mocks.cc
@@ -18,9 +18,15 @@
 D3D11DeviceMock::D3D11DeviceMock() = default;
 D3D11DeviceMock::~D3D11DeviceMock() = default;
 
+DXGIDeviceMock::DXGIDeviceMock() = default;
+DXGIDeviceMock::~DXGIDeviceMock() = default;
+
 DXGIDevice2Mock::DXGIDevice2Mock() = default;
 DXGIDevice2Mock::~DXGIDevice2Mock() = default;
 
+DXGIAdapterMock::DXGIAdapterMock() = default;
+DXGIAdapterMock::~DXGIAdapterMock() = default;
+
 DXGIAdapter3Mock::DXGIAdapter3Mock() = default;
 DXGIAdapter3Mock::~DXGIAdapter3Mock() = default;
 
diff --git a/media/base/win/d3d11_mocks.h b/media/base/win/d3d11_mocks.h
index 554daac..58b47d44 100644
--- a/media/base/win/d3d11_mocks.h
+++ b/media/base/win/d3d11_mocks.h
@@ -297,6 +297,29 @@
   MOCK_STDCALL_METHOD0(GetExceptionMode, UINT());
 };
 
+class DXGIDeviceMock : public MockCOMInterface<IDXGIDevice> {
+ public:
+  DXGIDeviceMock();
+  ~DXGIDeviceMock() override;
+
+  MOCK_STDCALL_METHOD5(CreateSurface,
+                       HRESULT(const DXGI_SURFACE_DESC*,
+                               UINT,
+                               DXGI_USAGE,
+                               const DXGI_SHARED_RESOURCE*,
+                               IDXGISurface**));
+  MOCK_STDCALL_METHOD1(GetAdapter, HRESULT(IDXGIAdapter**));
+  MOCK_STDCALL_METHOD1(GetGPUThreadPriority, HRESULT(INT*));
+  MOCK_STDCALL_METHOD3(QueryResourceResidency,
+                       HRESULT(IUnknown* const*, DXGI_RESIDENCY*, UINT));
+  MOCK_STDCALL_METHOD1(SetGPUThreadPriority, HRESULT(INT));
+  MOCK_STDCALL_METHOD3(SetPrivateData, HRESULT(REFGUID, UINT, const void*));
+  MOCK_STDCALL_METHOD2(SetPrivateDataInterface,
+                       HRESULT(REFGUID, const IUnknown*));
+  MOCK_STDCALL_METHOD2(GetParent, HRESULT(REFIID, void**));
+  MOCK_STDCALL_METHOD3(GetPrivateData, HRESULT(REFGUID, UINT*, void*));
+};
+
 class DXGIDevice2Mock : public MockCOMInterface<IDXGIDevice2> {
  public:
   DXGIDevice2Mock();
@@ -362,6 +385,37 @@
                        HRESULT(REFGUID, const IUnknown*));
 };
 
+class DXGIAdapterMock : public MockCOMInterface<IDXGIAdapter> {
+ public:
+  DXGIAdapterMock();
+  ~DXGIAdapterMock() override;
+
+  MOCK_STDCALL_METHOD3(QueryVideoMemoryInfo,
+                       HRESULT(UINT,
+                               DXGI_MEMORY_SEGMENT_GROUP,
+                               DXGI_QUERY_VIDEO_MEMORY_INFO*));
+  MOCK_STDCALL_METHOD2(RegisterHardwareContentProtectionTeardownStatusEvent,
+                       HRESULT(HANDLE, DWORD*));
+  MOCK_STDCALL_METHOD2(RegisterVideoMemoryBudgetChangeNotificationEvent,
+                       HRESULT(HANDLE, DWORD*));
+  MOCK_STDCALL_METHOD3(SetVideoMemoryReservation,
+                       HRESULT(UINT, DXGI_MEMORY_SEGMENT_GROUP, UINT64));
+  MOCK_STDCALL_METHOD1(UnregisterHardwareContentProtectionTeardownStatus,
+                       void(DWORD));
+  MOCK_STDCALL_METHOD1(UnregisterVideoMemoryBudgetChangeNotification,
+                       void(DWORD));
+  MOCK_STDCALL_METHOD1(GetDesc2, HRESULT(DXGI_ADAPTER_DESC2*));
+  MOCK_STDCALL_METHOD1(GetDesc1, HRESULT(DXGI_ADAPTER_DESC1*));
+  MOCK_STDCALL_METHOD2(CheckInterfaceSupport, HRESULT(REFGUID, LARGE_INTEGER*));
+  MOCK_STDCALL_METHOD2(EnumOutputs, HRESULT(UINT, IDXGIOutput**));
+  MOCK_STDCALL_METHOD1(GetDesc, HRESULT(DXGI_ADAPTER_DESC*));
+  MOCK_STDCALL_METHOD2(GetParent, HRESULT(REFIID, void**));
+  MOCK_STDCALL_METHOD3(GetPrivateData, HRESULT(REFGUID, UINT*, void*));
+  MOCK_STDCALL_METHOD3(SetPrivateData, HRESULT(REFGUID, UINT, const void*));
+  MOCK_STDCALL_METHOD2(SetPrivateDataInterface,
+                       HRESULT(REFGUID, const IUnknown*));
+};
+
 // TODO(crbug.com/788880): This may not be necessary. Tyr out and see if
 // D3D11VideoDevice1Mock is sufficient. and if so, remove this.
 class D3D11VideoDeviceMock : public MockCOMInterface<ID3D11VideoDevice> {
diff --git a/media/blink/watch_time_reporter_unittest.cc b/media/blink/watch_time_reporter_unittest.cc
index d7173d2..5a1564f 100644
--- a/media/blink/watch_time_reporter_unittest.cc
+++ b/media/blink/watch_time_reporter_unittest.cc
@@ -248,6 +248,12 @@
     void SetContainerName(
         container_names::MediaContainerName container_name) override {}
     void AddBytesReceived(uint64_t bytes_received) override {}
+    void SetHasPlayed() override {}
+    void SetHaveEnough() override {}
+    void SetHasAudio(AudioCodec audio_codec) override {}
+    void SetHasVideo(VideoCodec video_codec) override {}
+    void SetVideoPipelineInfo(const PipelineDecoderInfo& info) override {}
+    void SetAudioPipelineInfo(const PipelineDecoderInfo& info) override {}
 
    private:
     WatchTimeReporterTest* parent_;
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index 0655c33..ebf2436 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -770,6 +770,7 @@
   if (video_decode_stats_reporter_)
     video_decode_stats_reporter_->OnPlaying();
 
+  media_metrics_provider_->SetHasPlayed();
   media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PLAY));
 
   MaybeUpdateBufferSizesForPlayback();
@@ -1808,11 +1809,13 @@
       VIDEO_ROTATION_MAX + 1);
 
   if (HasAudio()) {
+    media_metrics_provider_->SetHasAudio(metadata.audio_decoder_config.codec());
     RecordEncryptionScheme("Audio",
                            metadata.audio_decoder_config.encryption_scheme());
   }
 
   if (HasVideo()) {
+    media_metrics_provider_->SetHasVideo(metadata.video_decoder_config.codec());
     RecordEncryptionScheme("Video",
                            metadata.video_decoder_config.encryption_scheme());
 
@@ -2010,6 +2013,9 @@
   log_event->params.SetBoolean("for_suspended_start", for_suspended_start);
   media_log_->AddEvent(std::move(log_event));
 
+  if (state == BUFFERING_HAVE_ENOUGH && !for_suspended_start)
+    media_metrics_provider_->SetHaveEnough();
+
   if (state == BUFFERING_HAVE_ENOUGH) {
     TRACE_EVENT1("media", "WebMediaPlayerImpl::BufferingHaveEnough", "id",
                  media_log_->id());
@@ -2237,11 +2243,12 @@
   UpdateBackgroundVideoOptimizationState();
 }
 
-void WebMediaPlayerImpl::OnAudioDecoderChange(const std::string& name) {
-  if (name == audio_decoder_name_)
+void WebMediaPlayerImpl::OnAudioDecoderChange(const PipelineDecoderInfo& info) {
+  media_metrics_provider_->SetAudioPipelineInfo(info);
+  if (info.decoder_name == audio_decoder_name_)
     return;
 
-  audio_decoder_name_ = name;
+  audio_decoder_name_ = info.decoder_name;
 
   // If there's no current reporter, there's nothing to be done.
   if (!watch_time_reporter_)
@@ -2250,11 +2257,12 @@
   UpdateSecondaryProperties();
 }
 
-void WebMediaPlayerImpl::OnVideoDecoderChange(const std::string& name) {
-  if (name == video_decoder_name_)
+void WebMediaPlayerImpl::OnVideoDecoderChange(const PipelineDecoderInfo& info) {
+  media_metrics_provider_->SetVideoPipelineInfo(info);
+  if (info.decoder_name == video_decoder_name_)
     return;
 
-  video_decoder_name_ = name;
+  video_decoder_name_ = info.decoder_name;
 
   // If there's no current reporter, there's nothing to be done.
   if (!watch_time_reporter_)
diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h
index 276ca9f..1408b6d 100644
--- a/media/blink/webmediaplayer_impl.h
+++ b/media/blink/webmediaplayer_impl.h
@@ -346,8 +346,8 @@
   void OnVideoNaturalSizeChange(const gfx::Size& size) override;
   void OnVideoOpacityChange(bool opaque) override;
   void OnVideoAverageKeyframeDistanceUpdate() override;
-  void OnAudioDecoderChange(const std::string& name) override;
-  void OnVideoDecoderChange(const std::string& name) override;
+  void OnAudioDecoderChange(const PipelineDecoderInfo& info) override;
+  void OnVideoDecoderChange(const PipelineDecoderInfo& info) override;
 
   // Actually seek. Avoids causing |should_notify_time_changed_| to be set when
   // |time_updated| is false.
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc
index 32ac014..22db4908 100644
--- a/media/blink/webmediaplayer_impl_unittest.cc
+++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -339,7 +339,9 @@
 
     mojom::MediaMetricsProviderPtr provider;
     MediaMetricsProvider::Create(
-        false, base::BindRepeating([]() { return ukm::kInvalidSourceId; }),
+        MediaMetricsProvider::BrowsingMode::kNormal,
+        MediaMetricsProvider::FrameStatus::kNotTopFrame,
+        base::BindRepeating([]() { return ukm::kInvalidSourceId; }),
         base::BindRepeating([]() { return learning::FeatureValue(0); }),
         VideoDecodePerfHistory::SaveCallback(), mojo::MakeRequest(&provider));
 
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc
index 0b84a019..c2cf3da8 100644
--- a/media/filters/decoder_stream.cc
+++ b/media/filters/decoder_stream.cc
@@ -384,7 +384,10 @@
   }
 
   // Send logs and statistics updates including the decoder name.
+  traits_->SetIsPlatformDecoder(decoder_->IsPlatformDecoder());
+  traits_->SetIsDecryptingDemuxerStream(!!decrypting_demuxer_stream_);
   traits_->ReportStatistics(statistics_cb_, 0);
+
   media_log_->SetBooleanProperty(GetStreamTypeString() + "_dds",
                                  !!decrypting_demuxer_stream_);
   media_log_->SetStringProperty(GetStreamTypeString() + "_decoder",
diff --git a/media/filters/decoder_stream_traits.cc b/media/filters/decoder_stream_traits.cc
index 69886c7..e917f92 100644
--- a/media/filters/decoder_stream_traits.cc
+++ b/media/filters/decoder_stream_traits.cc
@@ -35,6 +35,16 @@
   return OutputType::CreateEOSBuffer();
 }
 
+void DecoderStreamTraits<DemuxerStream::AUDIO>::SetIsPlatformDecoder(
+    bool is_platform_decoder) {
+  stats_.audio_decoder_info.is_platform_decoder = is_platform_decoder;
+}
+
+void DecoderStreamTraits<DemuxerStream::AUDIO>::SetIsDecryptingDemuxerStream(
+    bool is_dds) {
+  stats_.audio_decoder_info.is_decrypting_demuxer_stream = is_dds;
+}
+
 DecoderStreamTraits<DemuxerStream::AUDIO>::DecoderStreamTraits(
     MediaLog* media_log,
     ChannelLayout initial_hw_layout)
@@ -70,7 +80,7 @@
     OnConfigChanged(config);
   config_ = config;
 
-  stats_.audio_decoder_name = decoder->GetDisplayName();
+  stats_.audio_decoder_info.decoder_name = decoder->GetDisplayName();
   decoder->Initialize(config, cdm_context, std::move(init_cb), output_cb,
                       waiting_cb);
 }
@@ -121,6 +131,16 @@
   return OutputType::CreateEOSFrame();
 }
 
+void DecoderStreamTraits<DemuxerStream::VIDEO>::SetIsPlatformDecoder(
+    bool is_platform_decoder) {
+  stats_.video_decoder_info.is_platform_decoder = is_platform_decoder;
+}
+
+void DecoderStreamTraits<DemuxerStream::VIDEO>::SetIsDecryptingDemuxerStream(
+    bool is_dds) {
+  stats_.video_decoder_info.is_decrypting_demuxer_stream = is_dds;
+}
+
 DecoderStreamTraits<DemuxerStream::VIDEO>::DecoderStreamTraits(
     MediaLog* media_log)
     // Randomly selected number of samples to keep.
@@ -158,8 +178,8 @@
     const OutputCB& output_cb,
     const WaitingCB& waiting_cb) {
   DCHECK(config.IsValidConfig());
-  stats_.video_decoder_name = decoder->GetDisplayName();
-  DVLOG(2) << stats_.video_decoder_name;
+  stats_.video_decoder_info.decoder_name = decoder->GetDisplayName();
+  DVLOG(2) << stats_.video_decoder_info.decoder_name;
   decoder->Initialize(config, low_delay, cdm_context, std::move(init_cb),
                       output_cb, waiting_cb);
 }
diff --git a/media/filters/decoder_stream_traits.h b/media/filters/decoder_stream_traits.h
index 4c54717..aef034b6 100644
--- a/media/filters/decoder_stream_traits.h
+++ b/media/filters/decoder_stream_traits.h
@@ -1,10 +1,13 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #ifndef MEDIA_FILTERS_DECODER_STREAM_TRAITS_H_
 #define MEDIA_FILTERS_DECODER_STREAM_TRAITS_H_
 
+#include <memory>
+#include <string>
+
 #include "base/containers/flat_map.h"
 #include "base/time/time.h"
 #include "media/base/audio_decoder.h"
@@ -46,6 +49,8 @@
   DecoderStreamTraits(MediaLog* media_log, ChannelLayout initial_hw_layout);
 
   void ReportStatistics(const StatisticsCB& statistics_cb, int bytes_decoded);
+  void SetIsPlatformDecoder(bool is_platform_decoder);
+  void SetIsDecryptingDemuxerStream(bool is_dds);
   void InitializeDecoder(DecoderType* decoder,
                          const DecoderConfigType& config,
                          bool low_delay,
@@ -90,6 +95,8 @@
 
   DecoderConfigType GetDecoderConfig(DemuxerStream* stream);
   void ReportStatistics(const StatisticsCB& statistics_cb, int bytes_decoded);
+  void SetIsPlatformDecoder(bool is_platform_decoder);
+  void SetIsDecryptingDemuxerStream(bool is_dds);
   void InitializeDecoder(DecoderType* decoder,
                          const DecoderConfigType& config,
                          bool low_delay,
diff --git a/media/filters/pipeline_controller_unittest.cc b/media/filters/pipeline_controller_unittest.cc
index 0aab5b98..85e8223 100644
--- a/media/filters/pipeline_controller_unittest.cc
+++ b/media/filters/pipeline_controller_unittest.cc
@@ -154,8 +154,8 @@
   void OnVideoConfigChange(const VideoDecoderConfig& config) override {}
   void OnVideoOpacityChange(bool opaque) override {}
   void OnVideoAverageKeyframeDistanceUpdate() override {}
-  void OnAudioDecoderChange(const std::string& name) override {}
-  void OnVideoDecoderChange(const std::string& name) override {}
+  void OnAudioDecoderChange(const PipelineDecoderInfo& info) override {}
+  void OnVideoDecoderChange(const PipelineDecoderInfo& info) override {}
 
   base::test::ScopedTaskEnvironment scoped_task_environment_;
 
diff --git a/media/gpu/chromeos/chromeos_video_decoder_factory.cc b/media/gpu/chromeos/chromeos_video_decoder_factory.cc
index 80c0318..8497e37 100644
--- a/media/gpu/chromeos/chromeos_video_decoder_factory.cc
+++ b/media/gpu/chromeos/chromeos_video_decoder_factory.cc
@@ -11,7 +11,6 @@
 #include "media/gpu/buildflags.h"
 #include "media/gpu/linux/mailbox_video_frame_converter.h"
 #include "media/gpu/linux/platform_video_frame_pool.h"
-#include "media/gpu/linux/video_decoder_pipeline.h"
 
 #if BUILDFLAG(USE_VAAPI)
 #include "media/gpu/vaapi/vaapi_video_decoder.h"
@@ -21,6 +20,10 @@
 #include "media/gpu/v4l2/v4l2_slice_video_decoder.h"
 #endif
 
+#if BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC)
+#include "media/gpu/linux/video_decoder_pipeline.h"
+#endif
+
 namespace media {
 
 // static
@@ -65,12 +68,13 @@
       V4L2SliceVideoDecoder::Create(client_task_runner, std::move(frame_pool));
 #endif
 
-  if (!decoder)
-    return nullptr;
-
+#if BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC)
   return std::make_unique<VideoDecoderPipeline>(std::move(client_task_runner),
                                                 std::move(decoder),
                                                 std::move(frame_converter));
+#else
+  return nullptr;
+#endif
 }
 
 }  // namespace media
diff --git a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc
index 47188be..bc3c86d 100644
--- a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc
@@ -160,7 +160,7 @@
     vaapi_wrapper_->DestroyContext();
     va_format_ = 0;
     input_size_ = gfx::Size();
-    const bool success = vaapi_wrapper_->CreateContext(va_format, input_size);
+    const bool success = vaapi_wrapper_->CreateContext(input_size);
     if (!success) {
       VLOGF(1) << "Failed to create context";
       vaapi_wrapper_->DestroyContext();
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
index d328fd3..c4831ed 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -680,7 +680,7 @@
   if (buffer_allocation_mode_ == BufferAllocationMode::kNone) {
     DCHECK(!va_surface_ids.empty());
     RETURN_AND_NOTIFY_ON_FAILURE(
-        vaapi_wrapper_->CreateContext(va_surface_format_, requested_pic_size_),
+        vaapi_wrapper_->CreateContext(requested_pic_size_),
         "Failed creating VA Context", PLATFORM_FAILURE, );
     DCHECK_EQ(va_surface_ids.size(), buffers.size());
   } else {
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
index 8dc6f4bf..8392596 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
@@ -72,7 +72,7 @@
   MOCK_METHOD4(
       CreateContextAndSurfaces,
       bool(unsigned int, const gfx::Size&, size_t, std::vector<VASurfaceID>*));
-  MOCK_METHOD2(CreateContext, bool(unsigned int, const gfx::Size&));
+  MOCK_METHOD1(CreateContext, bool(const gfx::Size&));
   MOCK_METHOD1(DestroyContextAndSurfaces, void(std::vector<VASurfaceID>));
 
  private:
@@ -280,7 +280,7 @@
     // |decode_using_client_picture_buffers| determines the concrete method for
     // creation of context, surfaces and VaapiPictures.
     if (GetParam().decode_using_client_picture_buffers) {
-      EXPECT_CALL(*mock_vaapi_wrapper_, CreateContext(_, picture_size))
+      EXPECT_CALL(*mock_vaapi_wrapper_, CreateContext(picture_size))
           .WillOnce(Return(true));
       EXPECT_CALL(
           *mock_vaapi_picture_factory_,
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc
index 1078648..208f085c 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.cc
+++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -532,8 +532,7 @@
   // All pending decode operations will be completed before triggering a
   // resolution change, so we can safely destroy the context here.
   vaapi_wrapper_->DestroyContext();
-  vaapi_wrapper_->CreateContext(GetVaFormatForVideoCodecProfile(profile_),
-                                pic_size);
+  vaapi_wrapper_->CreateContext(pic_size);
 
   // Retry the current decode task.
   decoder_thread_task_runner_->PostTask(
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc
index 5e21cb2..80ba10a 100644
--- a/media/gpu/vaapi/vaapi_wrapper.cc
+++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -1296,7 +1296,7 @@
   if (!CreateSurfaces(va_format, size, num_surfaces, va_surfaces))
     return false;
 
-  const bool success = CreateContext(va_format, size);
+  const bool success = CreateContext(size);
   if (!success)
     DestroyContextAndSurfaces(*va_surfaces);
   return success;
@@ -1316,7 +1316,7 @@
   if (!scoped_va_surface)
     return nullptr;
 
-  if (CreateContext(va_format, size))
+  if (CreateContext(size))
     return scoped_va_surface;
 
   DestroyContext();
@@ -1329,8 +1329,7 @@
   DestroySurfaces(va_surfaces);
 }
 
-bool VaapiWrapper::CreateContext(unsigned int va_format,
-                                 const gfx::Size& size) {
+bool VaapiWrapper::CreateContext(const gfx::Size& size) {
   base::AutoLock auto_lock(*va_lock_);
 
   // vaCreateContext() doesn't really need an array of VASurfaceIDs (see
diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
index 8253cfa6..82950b26 100644
--- a/media/gpu/vaapi/vaapi_wrapper.h
+++ b/media/gpu/vaapi/vaapi_wrapper.h
@@ -151,8 +151,8 @@
   static uint32_t BufferFormatToVARTFormat(gfx::BufferFormat fmt);
 
   // Creates |num_surfaces| VASurfaceIDs of |va_format| and |size| and, if
-  // successful, creates a |va_context_id_| of the same format and size. Returns
-  // true if successful, with the created IDs in |va_surfaces|. The client is
+  // successful, creates a |va_context_id_| of the same size. Returns true if
+  // successful, with the created IDs in |va_surfaces|. The client is
   // responsible for destroying |va_surfaces| via DestroyContextAndSurfaces() to
   // free the allocated surfaces.
   virtual bool CreateContextAndSurfaces(unsigned int va_format,
@@ -160,10 +160,10 @@
                                         size_t num_surfaces,
                                         std::vector<VASurfaceID>* va_surfaces);
 
-  // Creates a single VASurfaceID of |va_format| and |size| and, if
-  // successful, creates a |va_context_id_| of the same format and size. Returns
-  // a ScopedVASurface containing the created VASurfaceID, the |va_format|, and
-  // |size|, or nullptr if creation failed.
+  // Creates a single VASurfaceID of |va_format| and |size| and, if successful,
+  // creates a |va_context_id_| of the same size. Returns a ScopedVASurface
+  // containing the created VASurfaceID, the |va_format|, and |size|, or nullptr
+  // if creation failed.
   std::unique_ptr<ScopedVASurface> CreateContextAndScopedVASurface(
       unsigned int va_format,
       const gfx::Size& size);
@@ -171,12 +171,11 @@
   // Releases the |va_surfaces| and destroys |va_context_id_|.
   virtual void DestroyContextAndSurfaces(std::vector<VASurfaceID> va_surfaces);
 
-  // Creates a VA Context of |va_format| and |size|, and sets |va_context_id_|.
-  // The client is responsible for releasing it via DestroyContext() or
+  // Creates a VA Context of |size| and sets |va_context_id_|. The client is
+  // responsible for releasing it via DestroyContext() or
   // DestroyContextAndSurfaces(), or it will be released on dtor.
-  // TODO(crbug.com/981080): |va_format| is not used within the function
-  // definition and should be removed.
-  virtual bool CreateContext(unsigned int va_format, const gfx::Size& size);
+  virtual bool CreateContext(const gfx::Size& size);
+
   // Destroys the context identified by |va_context_id_|.
   void DestroyContext();
 
diff --git a/media/gpu/windows/d3d11_cdm_proxy_unittest.cc b/media/gpu/windows/d3d11_cdm_proxy_unittest.cc
index 781a72c..374f9a9 100644
--- a/media/gpu/windows/d3d11_cdm_proxy_unittest.cc
+++ b/media/gpu/windows/d3d11_cdm_proxy_unittest.cc
@@ -139,6 +139,11 @@
                             base::Unretained(&create_device_mock_)));
   }
 
+  void TearDown() override {
+    proxy_.reset();
+    base::PowerMonitor::ShutdownForTesting();
+  }
+
   // Sets up ON_CALLs for the mock objects. These can be overriden with
   // EXPECT_CALLs.
   // |content_protection_caps_| should be set.
diff --git a/media/gpu/windows/d3d11_video_decoder.cc b/media/gpu/windows/d3d11_video_decoder.cc
index a14c0e1..c94bc88 100644
--- a/media/gpu/windows/d3d11_video_decoder.cc
+++ b/media/gpu/windows/d3d11_video_decoder.cc
@@ -25,6 +25,7 @@
 #include "media/gpu/windows/d3d11_picture_buffer.h"
 #include "media/gpu/windows/d3d11_video_context_wrapper.h"
 #include "media/gpu/windows/d3d11_video_decoder_impl.h"
+#include "media/gpu/windows/supported_profile_helpers.h"
 #include "ui/gl/gl_angle_util_win.h"
 #include "ui/gl/gl_switches.h"
 
@@ -752,40 +753,74 @@
       base::FeatureList::IsEnabled(kHardwareSecureDecryption);
 
   std::vector<SupportedVideoDecoderConfig> configs;
-
-  // Now check specific configs.
-  // For now, just return something that matches everything, since that's
-  // effectively what the workaround in mojo_video_decoder does.  Eventually, we
-  // should check resolutions and guids from the device we just created for both
-  // portrait and landscape orientations.
+  // VP9 has no default resolutions since it may not even be supported.
+  ResolutionPair max_h264_resolutions(gfx::Size(1920, 1088), gfx::Size());
+  ResolutionPair max_vp9_profile0_resolutions;
+  ResolutionPair max_vp9_profile2_resolutions;
   const gfx::Size min_resolution(64, 64);
-  const gfx::Size max_resolution(8192, 8192);  // Profile or landscape 8k
 
-  // Push H264 configs, except HIGH10.
-  configs.push_back(SupportedVideoDecoderConfig(
-      H264PROFILE_MIN,  // profile_min
-      static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE -
-                                     1),  // profile_max
-      min_resolution,                     // coded_size_min
-      max_resolution,                     // coded_size_max
-      allow_encrypted,                    // allow_encrypted
-      false));                            // require_encrypted
-  configs.push_back(SupportedVideoDecoderConfig(
-      static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE +
-                                     1),  // profile_min
-      H264PROFILE_MAX,                    // profile_max
-      min_resolution,                     // coded_size_min
-      max_resolution,                     // coded_size_max
-      allow_encrypted,                    // allow_encrypted
-      false));                            // require_encrypted
+  GetResolutionsForDecoders(
+      {D3D11_DECODER_PROFILE_H264_VLD_NOFGT}, d3d11_device, gpu_workarounds,
+      &max_h264_resolutions, &max_vp9_profile0_resolutions,
+      &max_vp9_profile2_resolutions);
 
-  configs.push_back(
-      SupportedVideoDecoderConfig(VP9PROFILE_PROFILE0,  // profile_min
-                                  VP9PROFILE_PROFILE0,  // profile_max
-                                  min_resolution,       // coded_size_min
-                                  max_resolution,       // coded_size_max
-                                  allow_encrypted,      // allow_encrypted
-                                  false));              // require_encrypted
+  if (max_h264_resolutions.first.width() > 0) {
+    // Push H264 configs, except HIGH10.
+    // landscape
+    configs.push_back(SupportedVideoDecoderConfig(
+        H264PROFILE_MIN,  // profile_min
+        static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE -
+                                       1),  // profile_max
+        min_resolution,                     // coded_size_min
+        max_h264_resolutions.first,         // coded_size_max
+        allow_encrypted,                    // allow_encrypted
+        false));                            // require_encrypted
+    configs.push_back(SupportedVideoDecoderConfig(
+        static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE +
+                                       1),  // profile_min
+        H264PROFILE_MAX,                    // profile_max
+        min_resolution,                     // coded_size_min
+        max_h264_resolutions.first,         // coded_size_max
+        allow_encrypted,                    // allow_encrypted
+        false));                            // require_encrypted
+
+    // portrait
+    configs.push_back(SupportedVideoDecoderConfig(
+        H264PROFILE_MIN,  // profile_min
+        static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE -
+                                       1),  // profile_max
+        min_resolution,                     // coded_size_min
+        max_h264_resolutions.second,        // coded_size_max
+        allow_encrypted,                    // allow_encrypted
+        false));                            // require_encrypted
+    configs.push_back(SupportedVideoDecoderConfig(
+        static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE +
+                                       1),  // profile_min
+        H264PROFILE_MAX,                    // profile_max
+        min_resolution,                     // coded_size_min
+        max_h264_resolutions.second,        // coded_size_max
+        allow_encrypted,                    // allow_encrypted
+        false));                            // require_encrypted
+  }
+
+  if (max_vp9_profile0_resolutions.first.width()) {
+    // landscape
+    configs.push_back(SupportedVideoDecoderConfig(
+        VP9PROFILE_PROFILE0,                 // profile_min
+        VP9PROFILE_PROFILE0,                 // profile_max
+        min_resolution,                      // coded_size_min
+        max_vp9_profile0_resolutions.first,  // coded_size_max
+        allow_encrypted,                     // allow_encrypted
+        false));                             // require_encrypted
+    // portrait
+    configs.push_back(SupportedVideoDecoderConfig(
+        VP9PROFILE_PROFILE0,                  // profile_min
+        VP9PROFILE_PROFILE0,                  // profile_max
+        min_resolution,                       // coded_size_min
+        max_vp9_profile0_resolutions.second,  // coded_size_max
+        allow_encrypted,                      // allow_encrypted
+        false));                              // require_encrypted
+  }
 
   // TODO(liberato): Should we separate out h264, vp9, and encrypted?
   UMA_HISTOGRAM_ENUMERATION(uma_name, NotSupportedReason::kVideoIsSupported);
diff --git a/media/gpu/windows/d3d11_video_decoder_unittest.cc b/media/gpu/windows/d3d11_video_decoder_unittest.cc
index ba940fe..8803fda7 100644
--- a/media/gpu/windows/d3d11_video_decoder_unittest.cc
+++ b/media/gpu/windows/d3d11_video_decoder_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/win/scoped_com_initializer.h"
+#include "base/win/windows_version.h"
 #include "media/base/decoder_buffer.h"
 #include "media/base/media_log.h"
 #include "media/base/media_switches.h"
@@ -53,6 +54,16 @@
 
 class D3D11VideoDecoderTest : public ::testing::Test {
  public:
+  enum InitExpectation {
+    kExpectFailure = false,
+    kExpectSuccess = true,
+  };
+
+  const std::pair<uint16_t, uint16_t> LegacyIntelGPU = {0x8086, 0x102};
+  const std::pair<uint16_t, uint16_t> RecentIntelGPU = {0x8086, 0x100};
+  const std::pair<uint16_t, uint16_t> LegacyAMDGPU = {0x1022, 0x130f};
+  const std::pair<uint16_t, uint16_t> RecentAMDGPU = {0x1022, 0x130e};
+
   void SetUp() override {
     // Set up some sane defaults.
     gpu_preferences_.enable_zero_copy_dxgi_video = true;
@@ -61,7 +72,7 @@
 
     // Create a mock D3D11 device that supports 11.0.  Note that if you change
     // this, then you probably also want VideoDevice1 and friends, below.
-    mock_d3d11_device_ = CreateD3D11Mock<D3D11DeviceMock>();
+    mock_d3d11_device_ = CreateD3D11Mock<NiceMock<D3D11DeviceMock>>();
     ON_CALL(*mock_d3d11_device_.Get(), GetFeatureLevel)
         .WillByDefault(Return(D3D_FEATURE_LEVEL_11_0));
 
@@ -72,10 +83,11 @@
     // Set up an D3D11VideoDevice rather than ...Device1, since Initialize uses
     // Device for checking decoder GUIDs.
     // TODO(liberato): Try to use Device1 more often.
-    mock_d3d11_video_device_ = CreateD3D11Mock<D3D11VideoDeviceMock>();
+    mock_d3d11_video_device_ =
+        CreateD3D11Mock<NiceMock<D3D11VideoDeviceMock>>();
     ON_CALL(*mock_d3d11_device_.Get(), QueryInterface(IID_ID3D11VideoDevice, _))
-        .WillByDefault(DoAll(SetComPointee<1>(mock_d3d11_video_device_.Get()),
-                             Return(S_OK)));
+        .WillByDefault(
+            SetComPointeeAndReturnOk<1>(mock_d3d11_video_device_.Get()));
 
     EnableDecoder(D3D11_DECODER_PROFILE_H264_VLD_NOFGT);
 
@@ -89,6 +101,29 @@
             QueryInterface(IID_ID3D11VideoContext, _))
         .WillByDefault(
             SetComPointeeAndReturnOk<1>(mock_d3d11_video_context_.Get()));
+
+    SetUpAdapters();
+  }
+
+  void SetGPUProfile(std::pair<uint16_t, uint16_t> vendor_and_gpu) {
+    mock_adapter_desc_.DeviceId = static_cast<UINT>(vendor_and_gpu.second);
+    mock_adapter_desc_.VendorId = static_cast<UINT>(vendor_and_gpu.first);
+
+    ON_CALL(*mock_dxgi_adapter_.Get(), GetDesc(_))
+        .WillByDefault(
+            DoAll(SetArgPointee<0>(mock_adapter_desc_), Return(S_OK)));
+  }
+
+  void SetUpAdapters() {
+    mock_dxgi_device_ = CreateD3D11Mock<NiceMock<DXGIDeviceMock>>();
+    ON_CALL(*mock_d3d11_device_.Get(), QueryInterface(IID_IDXGIDevice, _))
+        .WillByDefault(SetComPointeeAndReturnOk<1>(mock_dxgi_device_.Get()));
+
+    mock_dxgi_adapter_ = CreateD3D11Mock<NiceMock<DXGIAdapterMock>>();
+    ON_CALL(*mock_dxgi_device_.Get(), GetAdapter(_))
+        .WillByDefault(SetComPointeeAndReturnOk<0>(mock_dxgi_adapter_.Get()));
+
+    SetGPUProfile(RecentIntelGPU);
   }
 
   // Enable a decoder for the given GUID.  Only one decoder may be enabled at a
@@ -174,11 +209,6 @@
             get_device_cb, *supported_configs));
   }
 
-  enum InitExpectation {
-    kExpectFailure = false,
-    kExpectSuccess = true,
-  };
-
   void InitializeDecoder(const VideoDecoderConfig& config,
                          InitExpectation expectation) {
     const bool low_delay = false;
@@ -214,6 +244,10 @@
   Microsoft::WRL::ComPtr<D3D11VideoDeviceMock> mock_d3d11_video_device_;
   Microsoft::WRL::ComPtr<D3D11VideoDecoderMock> mock_d3d11_video_decoder_;
   Microsoft::WRL::ComPtr<D3D11VideoContextMock> mock_d3d11_video_context_;
+  Microsoft::WRL::ComPtr<DXGIDeviceMock> mock_dxgi_device_;
+  Microsoft::WRL::ComPtr<DXGIAdapterMock> mock_dxgi_adapter_;
+
+  DXGI_ADAPTER_DESC mock_adapter_desc_;
 
   base::Optional<base::test::ScopedFeatureList> scoped_feature_list_;
   base::win::ScopedCOMInitializer com_initializer_;
@@ -225,7 +259,32 @@
 
   EnableDecoder(D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0);
   CreateDecoder();
-  InitializeDecoder(configuration, kExpectSuccess);
+  // We don't support vp9 on windows 7 and below.
+  if (base::win::GetVersion() <= base::win::Version::WIN7) {
+    InitializeDecoder(configuration, kExpectFailure);
+  } else {
+    InitializeDecoder(configuration, kExpectSuccess);
+  }
+}
+
+TEST_F(D3D11VideoDecoderTest, DoesNotSupportVP9WithLegacyGPU) {
+  SetGPUProfile(LegacyIntelGPU);
+  VideoDecoderConfig configuration =
+      TestVideoConfig::NormalCodecProfile(kCodecVP9, VP9PROFILE_PROFILE0);
+
+  EnableDecoder(D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0);
+  CreateDecoder();
+  InitializeDecoder(configuration, kExpectFailure);
+}
+
+TEST_F(D3D11VideoDecoderTest, DoesNotSupportVP9WithGPUWorkaroundDisableVPX) {
+  gpu_workarounds_.disable_accelerated_vpx_decode = true;
+  VideoDecoderConfig configuration =
+      TestVideoConfig::NormalCodecProfile(kCodecVP9, VP9PROFILE_PROFILE0);
+
+  EnableDecoder(D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0);
+  CreateDecoder();
+  InitializeDecoder(configuration, kExpectFailure);
 }
 
 TEST_F(D3D11VideoDecoderTest, DoesNotSupportVP9WithoutDecoderEnabled) {
diff --git a/media/gpu/windows/supported_profile_helpers.h b/media/gpu/windows/supported_profile_helpers.h
index 62d77480..ae2a6a8 100644
--- a/media/gpu/windows/supported_profile_helpers.h
+++ b/media/gpu/windows/supported_profile_helpers.h
@@ -15,6 +15,8 @@
 #include "media/gpu/windows/d3d11_com_defs.h"
 #include "ui/gfx/geometry/rect.h"
 
+#include "ui/gfx/geometry/rect.h"
+
 namespace media {
 
 using ResolutionPair = std::pair<gfx::Size, gfx::Size>;
diff --git a/media/mojo/interfaces/media_metrics_provider.mojom b/media/mojo/interfaces/media_metrics_provider.mojom
index c08f817..9fccba4 100644
--- a/media/mojo/interfaces/media_metrics_provider.mojom
+++ b/media/mojo/interfaces/media_metrics_provider.mojom
@@ -42,6 +42,8 @@
   OnError(PipelineStatus status);
 
   // Setters for various one-time lazily generated metrics or properties.
+  SetHasPlayed();
+  SetHaveEnough();
   SetIsAdMedia();
   SetIsEME();
   SetTimeToMetadata(mojo_base.mojom.TimeDelta elapsed);
@@ -61,4 +63,10 @@
 
   // Reports that bytes have been received by the media player.
   AddBytesReceived(uint64 bytes_received);
+
+  // Can be called multiple times to set properties about a playback.
+  SetHasAudio(AudioCodec codec);
+  SetHasVideo(VideoCodec codec);
+  SetVideoPipelineInfo(PipelineDecoderInfo info);
+  SetAudioPipelineInfo(PipelineDecoderInfo info);
 };
diff --git a/media/mojo/interfaces/media_types.mojom b/media/mojo/interfaces/media_types.mojom
index 4ce1268..207bcb0f 100644
--- a/media/mojo/interfaces/media_types.mojom
+++ b/media/mojo/interfaces/media_types.mojom
@@ -340,3 +340,9 @@
   uint32 frames_power_efficient = 0;
 };
 
+// See media/base/pipeline/status.h for descriptions.
+struct PipelineDecoderInfo {
+  string decoder_name;
+  bool is_platform_decoder = false;
+  bool is_decrypting_demuxer_stream = false;
+};
diff --git a/media/mojo/interfaces/pipeline_statistics.typemap b/media/mojo/interfaces/pipeline_statistics.typemap
deleted file mode 100644
index 72b6951..0000000
--- a/media/mojo/interfaces/pipeline_statistics.typemap
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//media/mojo/interfaces/media_types.mojom"
-public_headers = [ "//media/base/pipeline_status.h" ]
-traits_headers =
-    [ "//media/mojo/interfaces/pipeline_statistics_struct_traits.h" ]
-type_mappings = [ "media.mojom.PipelineStatistics=media::PipelineStatistics" ]
diff --git a/media/mojo/interfaces/pipeline_status.typemap b/media/mojo/interfaces/pipeline_status.typemap
new file mode 100644
index 0000000..cb730c3b
--- /dev/null
+++ b/media/mojo/interfaces/pipeline_status.typemap
@@ -0,0 +1,11 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//media/mojo/interfaces/media_types.mojom"
+public_headers = [ "//media/base/pipeline_status.h" ]
+traits_headers = [ "//media/mojo/interfaces/pipeline_status_struct_traits.h" ]
+type_mappings = [
+  "media.mojom.PipelineStatistics=media::PipelineStatistics",
+  "media.mojom.PipelineDecoderInfo=media::PipelineDecoderInfo",
+]
diff --git a/media/mojo/interfaces/pipeline_statistics_struct_traits.h b/media/mojo/interfaces/pipeline_status_struct_traits.h
similarity index 61%
rename from media/mojo/interfaces/pipeline_statistics_struct_traits.h
rename to media/mojo/interfaces/pipeline_status_struct_traits.h
index 82eed288..f5a0d69 100644
--- a/media/mojo/interfaces/pipeline_statistics_struct_traits.h
+++ b/media/mojo/interfaces/pipeline_status_struct_traits.h
@@ -2,8 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MEDIA_MOJO_INTERFACES_PIPELINE_STATISTICS_STRUCT_TRAITS_H_
-#define MEDIA_MOJO_INTERFACES_PIPELINE_STATISTICS_STRUCT_TRAITS_H_
+#ifndef MEDIA_MOJO_INTERFACES_PIPELINE_STATUS_STRUCT_TRAITS_H_
+#define MEDIA_MOJO_INTERFACES_PIPELINE_STATUS_STRUCT_TRAITS_H_
+
+#include <string>
 
 #include "media/base/pipeline_status.h"
 #include "media/mojo/interfaces/media_types.mojom.h"
@@ -44,6 +46,30 @@
   }
 };
 
+template <>
+struct StructTraits<media::mojom::PipelineDecoderInfoDataView,
+                    media::PipelineDecoderInfo> {
+  static std::string decoder_name(const media::PipelineDecoderInfo& input) {
+    return input.decoder_name;
+  }
+
+  static bool is_platform_decoder(const media::PipelineDecoderInfo& input) {
+    return input.is_platform_decoder;
+  }
+
+  static bool is_decrypting_demuxer_stream(
+      const media::PipelineDecoderInfo& input) {
+    return input.is_decrypting_demuxer_stream;
+  }
+
+  static bool Read(media::mojom::PipelineDecoderInfoDataView data,
+                   media::PipelineDecoderInfo* output) {
+    output->is_platform_decoder = data.is_platform_decoder();
+    output->is_decrypting_demuxer_stream = data.is_decrypting_demuxer_stream();
+    return data.ReadDecoderName(&output->decoder_name);
+  }
+};
+
 }  // namespace mojo
 
-#endif  // MEDIA_MOJO_INTERFACES_PIPELINE_STATISTICS_STRUCT_TRAITS_H_
+#endif  // MEDIA_MOJO_INTERFACES_PIPELINE_STATUS_STRUCT_TRAITS_H_
diff --git a/media/mojo/interfaces/typemaps.gni b/media/mojo/interfaces/typemaps.gni
index 1de4153b..d0c6945 100644
--- a/media/mojo/interfaces/typemaps.gni
+++ b/media/mojo/interfaces/typemaps.gni
@@ -14,7 +14,7 @@
   "//media/mojo/interfaces/hdr_metadata.typemap",
   "//media/mojo/interfaces/media_drm_storage.typemap",
   "//media/mojo/interfaces/media_types.typemap",
-  "//media/mojo/interfaces/pipeline_statistics.typemap",
+  "//media/mojo/interfaces/pipeline_status.typemap",
   "//media/mojo/interfaces/video_color_space.typemap",
   "//media/mojo/interfaces/video_decoder.typemap",
   "//media/mojo/interfaces/video_decoder_config.typemap",
diff --git a/media/mojo/services/media_metrics_provider.cc b/media/mojo/services/media_metrics_provider.cc
index d55d2fe..e671c6ae 100644
--- a/media/mojo/services/media_metrics_provider.cc
+++ b/media/mojo/services/media_metrics_provider.cc
@@ -9,28 +9,41 @@
 
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+#include "build/build_config.h"
 #include "media/mojo/services/video_decode_stats_recorder.h"
 #include "media/mojo/services/watch_time_recorder.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
 
+#if !defined(OS_ANDROID)
+#include "media/filters/decrypting_video_decoder.h"
+#endif
+
 namespace media {
 
 constexpr char kInvalidInitialize[] = "Initialize() was not called correctly.";
 
 static uint64_t g_player_id = 0;
 
+MediaMetricsProvider::PipelineInfo::PipelineInfo(bool is_incognito)
+    : is_incognito(is_incognito) {}
+
+MediaMetricsProvider::PipelineInfo::~PipelineInfo() = default;
+
 MediaMetricsProvider::MediaMetricsProvider(
-    bool is_top_frame,
+    BrowsingMode is_incognito,
+    FrameStatus is_top_frame,
     ukm::SourceId source_id,
     learning::FeatureValue origin,
     VideoDecodePerfHistory::SaveCallback save_cb)
     : player_id_(g_player_id++),
-      is_top_frame_(is_top_frame),
+      is_top_frame_(is_top_frame == FrameStatus::kTopFrame),
       source_id_(source_id),
       origin_(origin),
-      save_cb_(std::move(save_cb)) {}
+      save_cb_(std::move(save_cb)),
+      uma_info_(is_incognito == BrowsingMode::kIncognito) {}
 
 MediaMetricsProvider::~MediaMetricsProvider() {
   // UKM may be unavailable in content_shell or other non-chrome/ builds; it
@@ -43,9 +56,9 @@
   ukm::builders::Media_WebMediaPlayerState builder(source_id_);
   builder.SetPlayerID(player_id_);
   builder.SetIsTopFrame(is_top_frame_);
-  builder.SetIsEME(is_eme_);
+  builder.SetIsEME(uma_info_.is_eme);
   builder.SetIsMSE(is_mse_);
-  builder.SetFinalPipelineStatus(pipeline_status_);
+  builder.SetFinalPipelineStatus(uma_info_.last_pipeline_status);
   if (!is_mse_) {
     builder.SetURLScheme(static_cast<int64_t>(url_scheme_));
     if (container_name_)
@@ -63,7 +76,7 @@
 
   // Buffered bytes are reported from a different source for EME/MSE.
   std::string suffix;
-  if (is_eme_)
+  if (uma_info_.is_eme)
     suffix = "EME";
   else if (is_mse_)
     suffix = "MSE";
@@ -77,18 +90,132 @@
     base::UmaHistogramMemoryKB("Ads.Media.BytesReceived." + suffix,
                                total_bytes_received_ >> 10);
   }
+
+  ReportPipelineUMA();
+}
+
+std::string MediaMetricsProvider::GetUMANameForAVStream(
+    const PipelineInfo& player_info) {
+  constexpr char kPipelineUmaPrefix[] = "Media.PipelineStatus.AudioVideo.";
+  std::string uma_name = kPipelineUmaPrefix;
+  if (player_info.video_codec == kCodecVP8) {
+    uma_name += "VP8.";
+  } else if (player_info.video_codec == kCodecVP9) {
+    uma_name += "VP9.";
+  } else if (player_info.video_codec == kCodecH264) {
+    uma_name += "H264.";
+  } else if (player_info.video_codec == kCodecAV1) {
+    uma_name += "AV1.";
+  } else {
+    return uma_name + "Other";
+  }
+
+#if !defined(OS_ANDROID)
+  if (player_info.video_pipeline_info.decoder_name ==
+      media::DecryptingVideoDecoder::kDecoderName) {
+    return uma_name + "DVD";
+  }
+#endif
+
+  if (player_info.video_pipeline_info.is_decrypting_demuxer_stream) {
+    uma_name += "DDS.";
+  }
+
+  // Note that HW essentially means 'platform' anyway. MediaCodec has been
+  // reported as HW forever, regardless of the underlying platform
+  // implementation.
+  if (player_info.video_pipeline_info.is_platform_decoder) {
+    uma_name += "HW";
+  } else {
+    uma_name += "SW";
+  }
+  return uma_name;
+}
+
+void MediaMetricsProvider::ReportPipelineUMA() {
+  if (uma_info_.has_video && uma_info_.has_audio) {
+    base::UmaHistogramExactLinear(GetUMANameForAVStream(uma_info_),
+                                  uma_info_.last_pipeline_status,
+                                  media::PIPELINE_STATUS_MAX + 1);
+  } else if (uma_info_.has_audio) {
+    base::UmaHistogramExactLinear("Media.PipelineStatus.AudioOnly",
+                                  uma_info_.last_pipeline_status,
+                                  media::PIPELINE_STATUS_MAX + 1);
+  } else if (uma_info_.has_video) {
+    base::UmaHistogramExactLinear("Media.PipelineStatus.VideoOnly",
+                                  uma_info_.last_pipeline_status,
+                                  media::PIPELINE_STATUS_MAX + 1);
+  } else {
+    // Note: This metric can be recorded as a result of normal operation with
+    // Media Source Extensions. If a site creates a MediaSource object but never
+    // creates a source buffer or appends data, PIPELINE_OK will be recorded.
+    base::UmaHistogramExactLinear("Media.PipelineStatus.Unsupported",
+                                  uma_info_.last_pipeline_status,
+                                  media::PIPELINE_STATUS_MAX + 1);
+  }
+
+  // Report whether video decoder fallback happened, but only if a video decoder
+  // was reported.
+  if (!uma_info_.video_pipeline_info.decoder_name.empty()) {
+    base::UmaHistogramBoolean("Media.VideoDecoderFallback",
+                              uma_info_.video_decoder_changed);
+  }
+
+  // Report whether this player ever saw a playback event. Used to measure the
+  // effectiveness of efforts to reduce loaded-but-never-used players.
+  if (uma_info_.has_reached_have_enough) {
+    base::UmaHistogramBoolean("Media.HasEverPlayed", uma_info_.has_ever_played);
+  }
+
+  // Report whether an encrypted playback is in incognito window, excluding
+  // never-used players.
+  if (uma_info_.is_eme && uma_info_.has_ever_played) {
+    base::UmaHistogramBoolean("Media.EME.IsIncognito", uma_info_.is_incognito);
+  }
 }
 
 // static
-void MediaMetricsProvider::Create(bool is_top_frame,
+void MediaMetricsProvider::Create(BrowsingMode is_incognito,
+                                  FrameStatus is_top_frame,
                                   GetSourceIdCallback get_source_id_cb,
                                   GetOriginCallback get_origin_cb,
                                   VideoDecodePerfHistory::SaveCallback save_cb,
                                   mojom::MediaMetricsProviderRequest request) {
-  mojo::MakeStrongBinding(std::make_unique<MediaMetricsProvider>(
-                              is_top_frame, get_source_id_cb.Run(),
-                              get_origin_cb.Run(), std::move(save_cb)),
-                          std::move(request));
+  mojo::MakeStrongBinding(
+      std::make_unique<MediaMetricsProvider>(
+          is_incognito, is_top_frame, get_source_id_cb.Run(),
+          get_origin_cb.Run(), std::move(save_cb)),
+      std::move(request));
+}
+
+void MediaMetricsProvider::SetHasPlayed() {
+  uma_info_.has_ever_played = true;
+}
+
+void MediaMetricsProvider::SetHasAudio(AudioCodec audio_codec) {
+  uma_info_.audio_codec = audio_codec;
+  uma_info_.has_audio = true;
+}
+
+void MediaMetricsProvider::SetHasVideo(VideoCodec video_codec) {
+  uma_info_.video_codec = video_codec;
+  uma_info_.has_video = true;
+}
+
+void MediaMetricsProvider::SetHaveEnough() {
+  uma_info_.has_reached_have_enough = true;
+}
+
+void MediaMetricsProvider::SetVideoPipelineInfo(
+    const PipelineDecoderInfo& info) {
+  if (!uma_info_.video_pipeline_info.decoder_name.empty())
+    uma_info_.video_decoder_changed = true;
+  uma_info_.video_pipeline_info = info;
+}
+
+void MediaMetricsProvider::SetAudioPipelineInfo(
+    const PipelineDecoderInfo& info) {
+  uma_info_.audio_pipeline_info = info;
 }
 
 void MediaMetricsProvider::Initialize(bool is_mse,
@@ -105,7 +232,7 @@
 
 void MediaMetricsProvider::OnError(PipelineStatus status) {
   DCHECK(initialized_);
-  pipeline_status_ = status;
+  uma_info_.last_pipeline_status = status;
 }
 
 void MediaMetricsProvider::SetIsAdMedia() {
@@ -115,7 +242,7 @@
 
 void MediaMetricsProvider::SetIsEME() {
   // This may be called before Initialize().
-  is_eme_ = true;
+  uma_info_.is_eme = true;
 }
 
 void MediaMetricsProvider::SetTimeToMetadata(base::TimeDelta elapsed) {
diff --git a/media/mojo/services/media_metrics_provider.h b/media/mojo/services/media_metrics_provider.h
index 25c04df..5199d51 100644
--- a/media/mojo/services/media_metrics_provider.h
+++ b/media/mojo/services/media_metrics_provider.h
@@ -6,6 +6,7 @@
 #define MEDIA_MOJO_SERVICES_MEDIA_METRICS_PROVIDER_H_
 
 #include <stdint.h>
+#include <string>
 
 #include "media/base/container_names.h"
 #include "media/base/pipeline_status.h"
@@ -17,13 +18,19 @@
 #include "services/metrics/public/cpp/ukm_source_id.h"
 
 namespace media {
+
 class VideoDecodePerfHistory;
 
 // See mojom::MediaMetricsProvider for documentation.
 class MEDIA_MOJO_EXPORT MediaMetricsProvider
     : public mojom::MediaMetricsProvider {
  public:
-  MediaMetricsProvider(bool is_top_frame,
+  enum class BrowsingMode : bool { kIncognito, kNormal };
+
+  enum class FrameStatus : bool { kTopFrame, kNotTopFrame };
+
+  MediaMetricsProvider(BrowsingMode is_incognito,
+                       FrameStatus is_top_frame,
                        ukm::SourceId source_id,
                        learning::FeatureValue origin,
                        VideoDecodePerfHistory::SaveCallback save_cb);
@@ -45,23 +52,48 @@
   // returns.  The intention is that they'll be run to produce the constructor
   // arguments for MediaMetricsProvider synchronously.  They should not be
   // copied or moved for later.
-  static void Create(bool is_top_frame,
+  static void Create(BrowsingMode is_incognito,
+                     FrameStatus is_top_frame,
                      GetSourceIdCallback get_source_id_cb,
                      GetOriginCallback get_origin_cb,
                      VideoDecodePerfHistory::SaveCallback save_cb,
                      mojom::MediaMetricsProviderRequest request);
 
  private:
+  struct PipelineInfo {
+    PipelineInfo(bool is_incognito);
+    ~PipelineInfo();
+    bool is_incognito;
+    bool has_ever_played = false;
+    bool has_reached_have_enough = false;
+    bool has_audio = false;
+    bool has_video = false;
+    bool is_eme = false;
+    bool video_decoder_changed = false;
+    AudioCodec audio_codec;
+    VideoCodec video_codec;
+    PipelineDecoderInfo video_pipeline_info;
+    PipelineDecoderInfo audio_pipeline_info;
+    PipelineStatus last_pipeline_status = PIPELINE_OK;
+  };
+
   // mojom::MediaMetricsProvider implementation:
   void Initialize(bool is_mse, mojom::MediaURLScheme url_scheme) override;
   void OnError(PipelineStatus status) override;
+  void SetAudioPipelineInfo(const PipelineDecoderInfo& info) override;
+  void SetContainerName(
+      container_names::MediaContainerName container_name) override;
+  void SetHasAudio(AudioCodec audio_codec) override;
+  void SetHasPlayed() override;
+  void SetHasVideo(VideoCodec video_codec) override;
+  void SetHaveEnough() override;
   void SetIsAdMedia() override;
   void SetIsEME() override;
   void SetTimeToMetadata(base::TimeDelta elapsed) override;
   void SetTimeToFirstFrame(base::TimeDelta elapsed) override;
   void SetTimeToPlayReady(base::TimeDelta elapsed) override;
-  void SetContainerName(
-      container_names::MediaContainerName container_name) override;
+  void SetVideoPipelineInfo(const PipelineDecoderInfo& info) override;
+
   void AcquireWatchTimeRecorder(
       mojom::PlaybackPropertiesPtr properties,
       mojom::WatchTimeRecorderRequest request) override;
@@ -69,6 +101,9 @@
       mojom::VideoDecodeStatsRecorderRequest request) override;
   void AddBytesReceived(uint64_t bytes_received) override;
 
+  void ReportPipelineUMA();
+  std::string GetUMANameForAVStream(const PipelineInfo& player_info);
+
   // Session unique ID which maps to a given WebMediaPlayerImpl instances. Used
   // to coordinate multiply logged events with a singly logged metric.
   const uint64_t player_id_;
@@ -81,9 +116,10 @@
 
   const VideoDecodePerfHistory::SaveCallback save_cb_;
 
+  // UMA pipeline packaged data
+  PipelineInfo uma_info_;
+
   // These values are not always sent but have known defaults.
-  PipelineStatus pipeline_status_ = PIPELINE_OK;
-  bool is_eme_ = false;
   bool is_ad_media_ = false;
 
   // The values below are only set if |initialized_| is true.
diff --git a/media/mojo/services/media_metrics_provider_unittest.cc b/media/mojo/services/media_metrics_provider_unittest.cc
index 5198b28..c069105 100644
--- a/media/mojo/services/media_metrics_provider_unittest.cc
+++ b/media/mojo/services/media_metrics_provider_unittest.cc
@@ -2,9 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "media/mojo/services/watch_time_recorder.h"
-
 #include <stddef.h>
+#include <memory>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
@@ -13,6 +12,7 @@
 #include "base/test/test_message_loop.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "media/mojo/services/media_metrics_provider.h"
+#include "media/mojo/services/watch_time_recorder.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -31,6 +31,7 @@
   ~MediaMetricsProviderTest() override { base::RunLoop().RunUntilIdle(); }
 
   void Initialize(bool is_mse,
+                  bool is_incognito,
                   bool is_top_frame,
                   const std::string& origin,
                   mojom::MediaURLScheme scheme) {
@@ -38,7 +39,10 @@
     test_recorder_->UpdateSourceURL(source_id_, GURL(origin));
 
     MediaMetricsProvider::Create(
-        is_top_frame,
+        (is_incognito ? MediaMetricsProvider::BrowsingMode::kIncognito
+                      : MediaMetricsProvider::BrowsingMode::kNormal),
+        (is_top_frame ? MediaMetricsProvider::FrameStatus::kTopFrame
+                      : MediaMetricsProvider::FrameStatus::kNotTopFrame),
         base::BindRepeating(&MediaMetricsProviderTest::GetSourceId,
                             base::Unretained(this)),
         base::BindRepeating([]() { return learning::FeatureValue(0); }),
@@ -71,7 +75,7 @@
   EXPECT_TRUE(test_recorder_->EntryHasMetric(entry, name));
 
 TEST_F(MediaMetricsProviderTest, TestUkm) {
-  Initialize(true, true, kTestOrigin, mojom::MediaURLScheme::kHttp);
+  Initialize(true, false, true, kTestOrigin, mojom::MediaURLScheme::kHttp);
   provider_.reset();
   base::RunLoop().RunUntilIdle();
 
@@ -106,7 +110,7 @@
   const base::TimeDelta kPlayReadyTime = base::TimeDelta::FromSeconds(3);
 
   ResetMetricRecorders();
-  Initialize(false, false, kTestOrigin2, mojom::MediaURLScheme::kHttps);
+  Initialize(false, false, false, kTestOrigin2, mojom::MediaURLScheme::kHttps);
   provider_->SetIsEME();
   provider_->SetTimeToMetadata(kMetadataTime);
   provider_->SetTimeToFirstFrame(kFirstFrameTime);
@@ -141,7 +145,7 @@
 
 TEST_F(MediaMetricsProviderTest, TestBytesReceivedUMA) {
   base::HistogramTester histogram_tester;
-  Initialize(false, false, kTestOrigin, mojom::MediaURLScheme::kHttp);
+  Initialize(false, false, false, kTestOrigin, mojom::MediaURLScheme::kHttp);
   provider_->AddBytesReceived(1 << 10);
   provider_.reset();
   base::RunLoop().RunUntilIdle();
@@ -152,7 +156,7 @@
   histogram_tester.ExpectTotalCount("Ads.Media.BytesReceived", 0);
 
   // EME is recorded in before MSE/SRC.
-  Initialize(true, false, kTestOrigin, mojom::MediaURLScheme::kHttp);
+  Initialize(true, false, false, kTestOrigin, mojom::MediaURLScheme::kHttp);
   provider_->AddBytesReceived(1 << 10);
   provider_->SetIsEME();
   provider_->SetIsAdMedia();
@@ -165,7 +169,7 @@
   histogram_tester.ExpectBucketCount("Ads.Media.BytesReceived.EME", 1, 1);
   histogram_tester.ExpectTotalCount("Ads.Media.BytesReceived.MSE", 0);
 
-  Initialize(true, false, kTestOrigin, mojom::MediaURLScheme::kHttp);
+  Initialize(true, false, false, kTestOrigin, mojom::MediaURLScheme::kHttp);
   provider_->AddBytesReceived(1 << 10);
   provider_->SetIsAdMedia();
   provider_.reset();
@@ -176,6 +180,59 @@
   histogram_tester.ExpectBucketCount("Ads.Media.BytesReceived", 1, 2);
 }
 
+TEST_F(MediaMetricsProviderTest, TestPipelineUMA) {
+  base::HistogramTester histogram_tester;
+  Initialize(false, false, false, kTestOrigin, mojom::MediaURLScheme::kHttps);
+  provider_->SetAudioPipelineInfo({false, false, "TestAudioDecoder"});
+  provider_->SetVideoPipelineInfo({false, false, "TestVideoDecoder"});
+  provider_->SetHasAudio(AudioCodec::kCodecVorbis);
+  provider_->SetHasVideo(VideoCodec::kCodecVP9);
+  provider_->SetHasPlayed();
+  provider_->SetHaveEnough();
+  provider_.reset();
+  base::RunLoop().RunUntilIdle();
+  histogram_tester.ExpectBucketCount("Media.PipelineStatus.AudioVideo.VP9.SW",
+                                     PIPELINE_OK, 1);
+  histogram_tester.ExpectBucketCount("Media.VideoDecoderFallback", false, 1);
+  histogram_tester.ExpectBucketCount("Media.HasEverPlayed", true, 1);
+}
+
+TEST_F(MediaMetricsProviderTest, TestPipelineUMANoAudioEMEHW) {
+  base::HistogramTester histogram_tester;
+  Initialize(false, false, false, kTestOrigin, mojom::MediaURLScheme::kHttps);
+  provider_->SetIsEME();
+  provider_->SetVideoPipelineInfo({true, true, "TestEMEVideoDecoder"});
+  provider_->SetHasVideo(VideoCodec::kCodecAV1);
+  provider_->SetHasPlayed();
+  provider_->SetHaveEnough();
+  provider_.reset();
+  base::RunLoop().RunUntilIdle();
+  histogram_tester.ExpectBucketCount("Media.PipelineStatus.VideoOnly",
+                                     PIPELINE_OK, 1);
+  histogram_tester.ExpectBucketCount("Media.VideoDecoderFallback", false, 1);
+  histogram_tester.ExpectBucketCount("Media.HasEverPlayed", true, 1);
+  histogram_tester.ExpectBucketCount("Media.EME.IsIncognito", false, 1);
+}
+
+TEST_F(MediaMetricsProviderTest, TestPipelineUMADecoderFallback) {
+  base::HistogramTester histogram_tester;
+  Initialize(false, false, false, kTestOrigin, mojom::MediaURLScheme::kHttps);
+  provider_->SetIsEME();
+  provider_->SetAudioPipelineInfo({false, false, "TestAudioDecoder"});
+  provider_->SetVideoPipelineInfo({true, false, "D3D11VideoDecoder"});
+  provider_->SetHasVideo(VideoCodec::kCodecVP9);
+  provider_->SetHasAudio(AudioCodec::kCodecVorbis);
+  provider_->SetHasPlayed();
+  provider_->SetHaveEnough();
+  provider_->SetVideoPipelineInfo({true, false, "DXVAVideoDecoder"});
+  provider_.reset();
+  base::RunLoop().RunUntilIdle();
+  histogram_tester.ExpectBucketCount("Media.PipelineStatus.AudioVideo.VP9.HW",
+                                     PIPELINE_OK, 1);
+  histogram_tester.ExpectBucketCount("Media.VideoDecoderFallback", true, 1);
+  histogram_tester.ExpectBucketCount("Media.HasEverPlayed", true, 1);
+}
+
 // Note: Tests for various Acquire* methods are contained with the unittests for
 // their respective classes.
 
diff --git a/media/mojo/services/watch_time_recorder_unittest.cc b/media/mojo/services/watch_time_recorder_unittest.cc
index 026f662..225daedc 100644
--- a/media/mojo/services/watch_time_recorder_unittest.cc
+++ b/media/mojo/services/watch_time_recorder_unittest.cc
@@ -5,6 +5,9 @@
 #include "media/mojo/services/watch_time_recorder.h"
 
 #include <stddef.h>
+#include <memory>
+#include <utility>
+#include <vector>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
@@ -54,7 +57,8 @@
     source_id_ = test_recorder_->GetNewSourceID();
     ResetMetricRecorders();
     MediaMetricsProvider::Create(
-        true /* is_top_frame */,
+        MediaMetricsProvider::BrowsingMode::kIncognito,
+        MediaMetricsProvider::FrameStatus::kTopFrame,
         base::BindRepeating(&WatchTimeRecorderTest::GetSourceId,
                             base::Unretained(this)),
         base::BindRepeating(
diff --git a/media/remoting/courier_renderer_unittest.cc b/media/remoting/courier_renderer_unittest.cc
index 017683f..37ba14af 100644
--- a/media/remoting/courier_renderer_unittest.cc
+++ b/media/remoting/courier_renderer_unittest.cc
@@ -49,6 +49,8 @@
   stats.audio_memory_usage = 5678;
   stats.video_memory_usage = 6789;
   stats.video_keyframe_distance_average = base::TimeDelta::Max();
+  stats.audio_decoder_info = {false, false, "Default"};
+  stats.video_decoder_info = {false, false, "Default"};
   return stats;
 }
 
@@ -350,6 +352,18 @@
     message->set_video_frames_dropped(stats.video_frames_dropped);
     message->set_audio_memory_usage(stats.audio_memory_usage);
     message->set_video_memory_usage(stats.video_memory_usage);
+    message->mutable_audio_decoder_info()->set_is_platform_decoder(
+        stats.audio_decoder_info.is_platform_decoder);
+    message->mutable_audio_decoder_info()->set_is_decrypting_demuxer_stream(
+        stats.audio_decoder_info.is_decrypting_demuxer_stream);
+    message->mutable_audio_decoder_info()->set_decoder_name(
+        stats.audio_decoder_info.decoder_name);
+    message->mutable_video_decoder_info()->set_is_platform_decoder(
+        stats.video_decoder_info.is_platform_decoder);
+    message->mutable_video_decoder_info()->set_is_decrypting_demuxer_stream(
+        stats.video_decoder_info.is_decrypting_demuxer_stream);
+    message->mutable_video_decoder_info()->set_decoder_name(
+        stats.video_decoder_info.decoder_name);
     OnReceivedRpc(std::move(rpc));
     RunPendingTasks();
   }
diff --git a/media/remoting/media_remoting_rpc.proto b/media/remoting/media_remoting_rpc.proto
index ebf5881..2abb9b3 100644
--- a/media/remoting/media_remoting_rpc.proto
+++ b/media/remoting/media_remoting_rpc.proto
@@ -270,6 +270,12 @@
   optional uint32 skip_byte_block = 6;
 }
 
+message PipelineDecoderInfo {
+  optional string decoder_name = 1;
+  optional bool is_platform_decoder = 2;
+  optional bool is_decrypting_demuxer_stream = 3;
+};
+
 message PipelineStatistics {
   optional uint64 audio_bytes_decoded = 1;
   optional uint64 video_bytes_decoded = 2;
@@ -278,8 +284,8 @@
   optional int64 audio_memory_usage = 5;
   optional int64 video_memory_usage = 6;
   optional int64 video_frame_duration_average_usec = 7;
-  optional string audio_decoder_name = 8;
-  optional string video_decoder_name = 9;
+  optional PipelineDecoderInfo audio_decoder_info = 8;
+  optional PipelineDecoderInfo video_decoder_info = 9;
 };
 
 message CdmKeyInformation {
diff --git a/media/remoting/proto_utils.cc b/media/remoting/proto_utils.cc
index 4fca7e8c9..6d34554c 100644
--- a/media/remoting/proto_utils.cc
+++ b/media/remoting/proto_utils.cc
@@ -415,10 +415,22 @@
 
   // The following fields were added after the initial message definition. Check
   // that sender provided the values.
-  if (stats_message.has_audio_decoder_name())
-    stats->audio_decoder_name = stats_message.audio_decoder_name();
-  if (stats_message.has_video_decoder_name())
-    stats->video_decoder_name = stats_message.video_decoder_name();
+  if (stats_message.has_audio_decoder_info()) {
+    auto audio_info = stats_message.audio_decoder_info();
+    stats->audio_decoder_info.decoder_name = audio_info.decoder_name();
+    stats->audio_decoder_info.is_platform_decoder =
+        audio_info.is_platform_decoder();
+    stats->audio_decoder_info.is_decrypting_demuxer_stream =
+        audio_info.is_decrypting_demuxer_stream();
+  }
+  if (stats_message.has_video_decoder_info()) {
+    auto video_info = stats_message.video_decoder_info();
+    stats->video_decoder_info.decoder_name = video_info.decoder_name();
+    stats->video_decoder_info.is_platform_decoder =
+        video_info.is_platform_decoder();
+    stats->video_decoder_info.is_decrypting_demuxer_stream =
+        video_info.is_decrypting_demuxer_stream();
+  }
   if (stats_message.has_video_frame_duration_average_usec()) {
     stats->video_frame_duration_average = base::TimeDelta::FromMicroseconds(
         stats_message.video_frame_duration_average_usec());
diff --git a/media/remoting/proto_utils_unittest.cc b/media/remoting/proto_utils_unittest.cc
index 0dd9d133..b20c4bb 100644
--- a/media/remoting/proto_utils_unittest.cc
+++ b/media/remoting/proto_utils_unittest.cc
@@ -144,11 +144,15 @@
   original.video_memory_usage = 43;
   original.video_keyframe_distance_average = base::TimeDelta::Max();
   original.video_frame_duration_average = base::TimeDelta::Max();
-  original.audio_decoder_name = "TestAudioDecoder";
-  original.video_decoder_name = "TestVideoDecoder";
+  original.audio_decoder_info = {false, false, "TestAudioDecoder"};
+  original.video_decoder_info = {false, false, "TestVideoDecoder"};
 
   // There is no convert-to-proto function, so just do that here.
   pb::PipelineStatistics pb_stats;
+  pb::PipelineDecoderInfo* pb_video_info =
+      pb_stats.mutable_video_decoder_info();
+  pb::PipelineDecoderInfo* pb_audio_info =
+      pb_stats.mutable_audio_decoder_info();
   pb_stats.set_audio_bytes_decoded(original.audio_bytes_decoded);
   pb_stats.set_video_bytes_decoded(original.video_bytes_decoded);
   pb_stats.set_video_frames_decoded(original.video_frames_decoded);
@@ -157,15 +161,30 @@
   pb_stats.set_video_memory_usage(original.video_memory_usage);
   pb_stats.set_video_frame_duration_average_usec(
       original.video_frame_duration_average.InMicroseconds());
-  pb_stats.set_audio_decoder_name(original.audio_decoder_name);
-  pb_stats.set_video_decoder_name(original.video_decoder_name);
+
+  pb_video_info->set_decoder_name(original.video_decoder_info.decoder_name);
+  pb_video_info->set_is_platform_decoder(
+      original.video_decoder_info.is_platform_decoder);
+  pb_video_info->set_is_decrypting_demuxer_stream(
+      original.video_decoder_info.is_decrypting_demuxer_stream);
+
+  pb_audio_info->set_decoder_name(original.audio_decoder_info.decoder_name);
+  pb_audio_info->set_is_platform_decoder(
+      original.audio_decoder_info.is_platform_decoder);
+  pb_audio_info->set_is_decrypting_demuxer_stream(
+      original.audio_decoder_info.is_decrypting_demuxer_stream);
 
   PipelineStatistics converted;
+
   // NOTE: fields will all be initialized with 0xcd. Forcing the conversion to
-  // properly assigned them. Don't memset() over non-primitive types like
-  // std::string since this will trigger corruption.
-  memset(&converted, 0xcd, sizeof(converted) - sizeof(std::string) * 2);
-  converted.video_decoder_name = converted.audio_decoder_name = "0xcdcdcdcd";
+  // properly assigned them. Since nested structs have strings, memsetting must
+  // be done infividually for them.
+  memset(&converted, 0xcd, sizeof(converted) - sizeof(PipelineDecoderInfo) * 2);
+  memset(&converted.audio_decoder_info, 0xcd,
+         sizeof(PipelineDecoderInfo) - sizeof(std::string));
+  memset(&converted.video_decoder_info, 0xcd,
+         sizeof(PipelineDecoderInfo) - sizeof(std::string));
+
   ConvertProtoToPipelineStatistics(pb_stats, &converted);
 
   // If this fails, did media::PipelineStatistics add/change fields that are not
diff --git a/media/test/pipeline_integration_test_base.h b/media/test/pipeline_integration_test_base.h
index b5beb72..b5ce726 100644
--- a/media/test/pipeline_integration_test_base.h
+++ b/media/test/pipeline_integration_test_base.h
@@ -241,8 +241,8 @@
   MOCK_METHOD1(OnAudioConfigChange, void(const AudioDecoderConfig&));
   MOCK_METHOD1(OnVideoOpacityChange, void(bool));
   MOCK_METHOD0(OnVideoAverageKeyframeDistanceUpdate, void());
-  MOCK_METHOD1(OnAudioDecoderChange, void(const std::string&));
-  MOCK_METHOD1(OnVideoDecoderChange, void(const std::string&));
+  MOCK_METHOD1(OnAudioDecoderChange, void(const PipelineDecoderInfo&));
+  MOCK_METHOD1(OnVideoDecoderChange, void(const PipelineDecoderInfo&));
   MOCK_METHOD1(OnRemotePlayStateChange, void(MediaStatus::State state));
 
  private:
diff --git a/mojo/public/tools/bindings/chromium_bindings_configuration.gni b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
index 8c7df7d..ebc83d3 100644
--- a/mojo/public/tools/bindings/chromium_bindings_configuration.gni
+++ b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
@@ -52,7 +52,7 @@
   "//ui/base/accelerators/mojo/typemaps.gni",
   "//ui/base/ime/mojo/typemaps.gni",
   "//ui/base/mojom/typemaps.gni",
-  "//ui/display/mojo/typemaps.gni",
+  "//ui/display/mojom/typemaps.gni",
   "//ui/events/mojo/typemaps.gni",
   "//ui/gfx/typemaps.gni",
   "//ui/latency/mojo/typemaps.gni",
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 011a4b9b..8ee047b 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1219,8 +1219,6 @@
       "ssl/ssl_platform_key_util.cc",
       "ssl/ssl_platform_key_util.h",
       "ssl/ssl_platform_key_win.cc",
-      "ssl/test_ssl_private_key.cc",
-      "ssl/test_ssl_private_key.h",
       "ssl/threaded_ssl_private_key.cc",
       "ssl/threaded_ssl_private_key.h",
       "third_party/mozilla_security_manager/nsNSSCertificateDB.cpp",
@@ -2784,6 +2782,8 @@
     "ssl/client_cert_identity_test_util.h",
     "ssl/ssl_private_key_test_util.cc",
     "ssl/ssl_private_key_test_util.h",
+    "ssl/test_ssl_private_key.cc",
+    "ssl/test_ssl_private_key.h",
     "test/cert_test_util.cc",
     "test/cert_test_util.h",
     "test/cert_test_util_nss.cc",
diff --git a/net/base/port_util.h b/net/base/port_util.h
index 72d4b39..b64b137 100644
--- a/net/base/port_util.h
+++ b/net/base/port_util.h
@@ -21,7 +21,7 @@
 
 // Returns true if the port is in the range [0, 1023]. These ports are
 // registered by IANA and typically need root access to listen on.
-bool IsWellKnownPort(int port);
+NET_EXPORT bool IsWellKnownPort(int port);
 
 // Checks if the port is allowed for the specified scheme.  Ports set as allowed
 // with SetExplicitlyAllowedPorts() or by using ScopedPortException() will be
diff --git a/net/disk_cache/memory/mem_entry_impl.cc b/net/disk_cache/memory/mem_entry_impl.cc
index 71a34737..6315d815 100644
--- a/net/disk_cache/memory/mem_entry_impl.cc
+++ b/net/disk_cache/memory/mem_entry_impl.cc
@@ -36,20 +36,6 @@
 // Sparse entry children have maximum size of 4KB.
 const int kMaxChildEntrySize = 1 << kMaxChildEntryBits;
 
-// This enum is used for histograms, so only append to the end.
-enum MemEntryWriteResult {
-  MEM_ENTRY_WRITE_RESULT_SUCCESS = 0,
-  MEM_ENTRY_WRITE_RESULT_INVALID_ARGUMENT = 1,
-  MEM_ENTRY_WRITE_RESULT_OVER_MAX_ENTRY_SIZE = 2,
-  MEM_ENTRY_WRITE_RESULT_EXCEEDED_CACHE_STORAGE_SIZE = 3,
-  MEM_ENTRY_WRITE_RESULT_MAX = 4,
-};
-
-void RecordWriteResult(MemEntryWriteResult result) {
-  UMA_HISTOGRAM_ENUMERATION("MemCache.WriteResult", result,
-                            MEM_ENTRY_WRITE_RESULT_MAX);
-}
-
 // Convert global offset to child index.
 int64_t ToChildIndex(int64_t offset) {
   return offset >> kMaxChildEntryBits;
@@ -373,22 +359,14 @@
 int MemEntryImpl::InternalWriteData(int index, int offset, IOBuffer* buf,
                                     int buf_len, bool truncate) {
   DCHECK(type() == PARENT_ENTRY || index == kSparseData);
-  if (!backend_) {
-    // We have to fail writes after the backend is destroyed since we can't
-    // ensure we wouldn't use too much memory if it's gone.
-    RecordWriteResult(MEM_ENTRY_WRITE_RESULT_EXCEEDED_CACHE_STORAGE_SIZE);
+  if (!backend_)
     return net::ERR_INSUFFICIENT_RESOURCES;
-  }
 
-  if (index < 0 || index >= kNumStreams) {
-    RecordWriteResult(MEM_ENTRY_WRITE_RESULT_INVALID_ARGUMENT);
+  if (index < 0 || index >= kNumStreams)
     return net::ERR_INVALID_ARGUMENT;
-  }
 
-  if (offset < 0 || buf_len < 0) {
-    RecordWriteResult(MEM_ENTRY_WRITE_RESULT_INVALID_ARGUMENT);
+  if (offset < 0 || buf_len < 0)
     return net::ERR_INVALID_ARGUMENT;
-  }
 
   int max_file_size = backend_->MaxFileSize();
 
@@ -396,7 +374,6 @@
   if (offset > max_file_size || buf_len > max_file_size ||
       !base::CheckAdd(offset, buf_len).AssignIfValid(&end_offset) ||
       end_offset > max_file_size) {
-    RecordWriteResult(MEM_ENTRY_WRITE_RESULT_OVER_MAX_ENTRY_SIZE);
     return net::ERR_FAILED;
   }
 
@@ -406,7 +383,6 @@
     backend_->ModifyStorageSize(delta);
     if (backend_->HasExceededStorageSize()) {
       backend_->ModifyStorageSize(-delta);
-      RecordWriteResult(MEM_ENTRY_WRITE_RESULT_EXCEEDED_CACHE_STORAGE_SIZE);
       return net::ERR_INSUFFICIENT_RESOURCES;
     }
 
@@ -420,7 +396,6 @@
   }
 
   UpdateStateOnUse(ENTRY_WAS_MODIFIED);
-  RecordWriteResult(MEM_ENTRY_WRITE_RESULT_SUCCESS);
 
   if (!buf_len)
     return 0;
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
index 6c76aff..7b3a3aa8 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
@@ -392,7 +392,7 @@
                           base::Unretained(this)),
                net_log.bound());
   base::RunLoop run_loop;
-  net_log.SetCaptureMode(NetLogCaptureMode::kDefault);
+  net_log.SetObserverCaptureMode(NetLogCaptureMode::kDefault);
   store_->LoadCookiesForKey(
       "aaa.com", base::Bind(&SQLitePersistentCookieStoreTest::OnKeyLoaded,
                             base::Unretained(this), run_loop.QuitClosure()));
diff --git a/net/http/bidirectional_stream_unittest.cc b/net/http/bidirectional_stream_unittest.cc
index 76cb401..c0bb843d 100644
--- a/net/http/bidirectional_stream_unittest.cc
+++ b/net/http/bidirectional_stream_unittest.cc
@@ -408,7 +408,7 @@
     ssl_data_.next_proto = kProtoHTTP2;
     ssl_data_.ssl_info.cert =
         ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
-    net_log_.SetCaptureMode(NetLogCaptureMode::kEverything);
+    net_log_.SetObserverCaptureMode(NetLogCaptureMode::kEverything);
     socket_factory_ = new MockTaggingClientSocketFactory();
     session_deps_.socket_factory.reset(socket_factory_);
   }
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index 7938452..ada5de2 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -88,20 +88,9 @@
 
 }  // namespace
 
-#define CACHE_STATUS_HISTOGRAMS(type)                                        \
-  do {                                                                       \
-    UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern" type, cache_entry_status_, \
-                              CacheEntryStatus::ENTRY_MAX);                  \
-    if (validation_request) {                                                \
-      UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause" type,            \
-                                validation_cause_, VALIDATION_CAUSE_MAX);    \
-    }                                                                        \
-    if (stale_request) {                                                     \
-      UMA_HISTOGRAM_COUNTS_1M(                                               \
-          "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed" type,         \
-          freshness_periods_since_last_used);                                \
-    }                                                                        \
-  } while (0)
+#define CACHE_STATUS_HISTOGRAMS(type)                                      \
+  UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern" type, cache_entry_status_, \
+                            CacheEntryStatus::ENTRY_MAX)
 
 struct HeaderNameAndValue {
   const char* name;
@@ -1030,7 +1019,7 @@
   mode_ = NONE;
 
   // Keep track of the fraction of requests that we can double-key.
-  UMA_HISTOGRAM_BOOLEAN("HttpCache.TopFrameOriginPresent",
+  UMA_HISTOGRAM_BOOLEAN("HttpCache.NetworkIsolationKeyPresent",
                         request_->network_isolation_key.IsFullyPopulated());
 
   if (!ShouldPassThrough()) {
@@ -2716,10 +2705,6 @@
       validation_cause_ = VALIDATION_CAUSE_ZERO_FRESHNESS;
     } else {
       validation_cause_ = VALIDATION_CAUSE_STALE;
-      stale_entry_freshness_ = lifetimes.freshness;
-      stale_entry_age_ = response_.headers->GetCurrentAge(
-          response_.request_time, response_.response_time,
-          cache_->clock_->Now());
     }
   }
 
@@ -3378,45 +3363,6 @@
       cache_entry_status_ == CacheEntryStatus::ENTRY_VALIDATED ||
       cache_entry_status_ == CacheEntryStatus::ENTRY_UPDATED;
 
-  bool stale_request =
-      validation_cause_ == VALIDATION_CAUSE_STALE &&
-      (validation_request ||
-       cache_entry_status_ == CacheEntryStatus::ENTRY_CANT_CONDITIONALIZE);
-  int64_t freshness_periods_since_last_used = 0;
-
-  if (stale_request && !open_entry_last_used_.is_null()) {
-    // Note that we are not able to capture those transactions' histograms which
-    // when added to entry, the response was being written by another
-    // transaction because getting the last used timestamp might lead to a data
-    // race in that case. TODO(crbug.com/713354).
-
-    // For stale entries, record how many freshness periods have elapsed since
-    // the entry was last used.
-    DCHECK(!stale_entry_freshness_.is_zero());
-    base::TimeDelta time_since_use = base::Time::Now() - open_entry_last_used_;
-    freshness_periods_since_last_used =
-        (time_since_use * 1000) / stale_entry_freshness_;
-
-    if (validation_request) {
-      int64_t age_in_freshness_periods =
-          (stale_entry_age_ * 100) / stale_entry_freshness_;
-      if (cache_entry_status_ == CacheEntryStatus::ENTRY_VALIDATED) {
-        UMA_HISTOGRAM_COUNTS_1M("HttpCache.StaleEntry.Validated.Age",
-                                stale_entry_age_.InSeconds());
-        UMA_HISTOGRAM_COUNTS_1M(
-            "HttpCache.StaleEntry.Validated.AgeInFreshnessPeriods",
-            age_in_freshness_periods);
-
-      } else {
-        UMA_HISTOGRAM_COUNTS_1M("HttpCache.StaleEntry.Updated.Age",
-                                stale_entry_age_.InSeconds());
-        UMA_HISTOGRAM_COUNTS_1M(
-            "HttpCache.StaleEntry.Updated.AgeInFreshnessPeriods",
-            age_in_freshness_periods);
-      }
-    }
-  }
-
   std::string mime_type;
   HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get();
   if (response_headers && response_headers->GetMimeType(&mime_type)) {
@@ -3456,6 +3402,10 @@
   }
 
   CACHE_STATUS_HISTOGRAMS("");
+  if (validation_request) {
+    UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause", validation_cause_,
+                              VALIDATION_CAUSE_MAX);
+  }
 
   if (cache_entry_status_ == CacheEntryStatus::ENTRY_CANT_CONDITIONALIZE) {
     UMA_HISTOGRAM_ENUMERATION("HttpCache.CantConditionalizeCause",
diff --git a/net/http/http_cache_transaction.h b/net/http/http_cache_transaction.h
index da341f2..bedd502 100644
--- a/net/http/http_cache_transaction.h
+++ b/net/http/http_cache_transaction.h
@@ -620,8 +620,6 @@
   base::TimeTicks send_request_since_;
   base::TimeTicks read_headers_since_;
   base::Time open_entry_last_used_;
-  base::TimeDelta stale_entry_freshness_;
-  base::TimeDelta stale_entry_age_;
   bool cant_conditionalize_zero_freshness_from_memhint_;
   bool recorded_histograms_;
   ParallelWritingPattern parallel_writing_pattern_;
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc
index 172a86b..38a334daa 100644
--- a/net/http/http_cache_unittest.cc
+++ b/net/http/http_cache_unittest.cc
@@ -9635,7 +9635,8 @@
   RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction,
                                 trans_info, &response);
   EXPECT_FALSE(response.was_cached);
-  histograms.ExpectUniqueSample("HttpCache.TopFrameOriginPresent", false, 1);
+  histograms.ExpectUniqueSample("HttpCache.NetworkIsolationKeyPresent", false,
+                                1);
 
   RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction,
                                 trans_info, &response);
@@ -9647,8 +9648,8 @@
   RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction,
                                 trans_info, &response);
   EXPECT_FALSE(response.was_cached);
-  histograms.ExpectBucketCount("HttpCache.TopFrameOriginPresent", true, 1);
-  histograms.ExpectTotalCount("HttpCache.TopFrameOriginPresent", 3);
+  histograms.ExpectBucketCount("HttpCache.NetworkIsolationKeyPresent", true, 1);
+  histograms.ExpectTotalCount("HttpCache.NetworkIsolationKeyPresent", 3);
 
   // The second request should be cached.
   RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction,
@@ -9730,8 +9731,8 @@
   RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction,
                                 trans_info, &response);
   EXPECT_TRUE(response.was_cached);
-  histograms.ExpectBucketCount("HttpCache.TopFrameOriginPresent", true, 1);
-  histograms.ExpectTotalCount("HttpCache.TopFrameOriginPresent", 3);
+  histograms.ExpectBucketCount("HttpCache.NetworkIsolationKeyPresent", true, 1);
+  histograms.ExpectTotalCount("HttpCache.NetworkIsolationKeyPresent", 3);
 }
 
 TEST_F(HttpCacheTest, SkipVaryCheck) {
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 346b8e84..e88fd253 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -101,6 +101,7 @@
 #include "net/spdy/spdy_test_util_common.h"
 #include "net/ssl/client_cert_identity_test_util.h"
 #include "net/ssl/ssl_cert_request_info.h"
+#include "net/ssl/ssl_config.h"
 #include "net/ssl/ssl_config_service.h"
 #include "net/ssl/ssl_info.h"
 #include "net/ssl/ssl_private_key.h"
@@ -360,6 +361,11 @@
     return false;
   }
 
+  void UpdateSSLConfigAndNotify(const SSLConfig& config) {
+    config_ = config;
+    NotifySSLConfigChange();
+  }
+
  private:
   SSLConfig config_;
 };
@@ -21449,4 +21455,148 @@
   trans2.reset();
 }
 
+// Test that SSLConfig changes from SSLConfigService are picked up even when
+// there are live sockets.
+TEST_F(HttpNetworkTransactionTest, SSLConfigChanged) {
+  SSLConfig ssl_config;
+  ssl_config.version_max = SSL_PROTOCOL_VERSION_TLS1_3;
+  auto ssl_config_service = std::make_unique<TestSSLConfigService>(ssl_config);
+  TestSSLConfigService* ssl_config_service_raw = ssl_config_service.get();
+
+  session_deps_.ssl_config_service = std::move(ssl_config_service);
+
+  // Make three requests. Between the second and third, the SSL config will
+  // change.
+  HttpRequestInfo request1;
+  request1.method = "GET";
+  request1.url = GURL("https://foo.test/1");
+  request1.traffic_annotation =
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+
+  HttpRequestInfo request2;
+  request2.method = "GET";
+  request2.url = GURL("https://foo.test/2");
+  request2.traffic_annotation =
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+
+  HttpRequestInfo request3;
+  request3.method = "GET";
+  request3.url = GURL("https://foo.test/3");
+  request3.traffic_annotation =
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+
+  const MockWrite kWrites1[] = {
+      MockWrite("GET /1 HTTP/1.1\r\n"
+                "Host: foo.test\r\n"
+                "Connection: keep-alive\r\n\r\n"),
+      MockWrite("GET /2 HTTP/1.1\r\n"
+                "Host: foo.test\r\n"
+                "Connection: keep-alive\r\n\r\n"),
+  };
+
+  const MockRead kReads1[] = {
+      MockRead("HTTP/1.1 200 OK\r\n"
+               "Connection: keep-alive\r\n"
+               "Content-Length: 1\r\n\r\n"
+               "1"),
+      MockRead("HTTP/1.1 200 OK\r\n"
+               "Connection: keep-alive\r\n"
+               "Content-Length: 1\r\n\r\n"
+               "2"),
+  };
+
+  // The third request goes on a different socket because the SSL config has
+  // changed.
+  const MockWrite kWrites2[] = {
+      MockWrite("GET /3 HTTP/1.1\r\n"
+                "Host: foo.test\r\n"
+                "Connection: keep-alive\r\n\r\n")};
+
+  const MockRead kReads2[] = {
+      MockRead("HTTP/1.1 200 OK\r\n"
+               "Connection: keep-alive\r\n"
+               "Content-Length: 1\r\n\r\n"
+               "3")};
+
+  StaticSocketDataProvider data1(kReads1, kWrites1);
+  StaticSocketDataProvider data2(kReads2, kWrites2);
+  session_deps_.socket_factory->AddSocketDataProvider(&data1);
+  session_deps_.socket_factory->AddSocketDataProvider(&data2);
+
+  SSLSocketDataProvider ssl1(ASYNC, OK);
+  ssl1.expected_ssl_version_max = SSL_PROTOCOL_VERSION_TLS1_3;
+  SSLSocketDataProvider ssl2(ASYNC, OK);
+  ssl2.expected_ssl_version_max = SSL_PROTOCOL_VERSION_TLS1_2;
+  session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl1);
+  session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2);
+
+  std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
+
+  TestCompletionCallback callback;
+  auto trans1 =
+      std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
+  int rv = trans1->Start(&request1, callback.callback(), NetLogWithSource());
+  EXPECT_THAT(callback.GetResult(rv), IsOk());
+  std::string response_data1;
+  EXPECT_THAT(ReadTransaction(trans1.get(), &response_data1), IsOk());
+  EXPECT_EQ("1", response_data1);
+  trans1.reset();
+
+  auto trans2 =
+      std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
+  rv = trans2->Start(&request2, callback.callback(), NetLogWithSource());
+  EXPECT_THAT(callback.GetResult(rv), IsOk());
+  std::string response_data2;
+  EXPECT_THAT(ReadTransaction(trans2.get(), &response_data2), IsOk());
+  EXPECT_EQ("2", response_data2);
+  trans2.reset();
+
+  ssl_config.version_max = SSL_PROTOCOL_VERSION_TLS1_2;
+  ssl_config_service_raw->UpdateSSLConfigAndNotify(ssl_config);
+
+  auto trans3 =
+      std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
+  rv = trans3->Start(&request3, callback.callback(), NetLogWithSource());
+  EXPECT_THAT(callback.GetResult(rv), IsOk());
+  std::string response_data3;
+  EXPECT_THAT(ReadTransaction(trans3.get(), &response_data3), IsOk());
+  EXPECT_EQ("3", response_data3);
+  trans3.reset();
+}
+
+TEST_F(HttpNetworkTransactionTest, SSLConfigChangedPendingConnect) {
+  SSLConfig ssl_config;
+  ssl_config.version_max = SSL_PROTOCOL_VERSION_TLS1_3;
+  auto ssl_config_service = std::make_unique<TestSSLConfigService>(ssl_config);
+  TestSSLConfigService* ssl_config_service_raw = ssl_config_service.get();
+
+  session_deps_.ssl_config_service = std::move(ssl_config_service);
+
+  HttpRequestInfo request;
+  request.method = "GET";
+  request.url = GURL("https://foo.test/1");
+  request.traffic_annotation =
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+
+  // Make a socket which never connects.
+  StaticSocketDataProvider data({}, {});
+  session_deps_.socket_factory->AddSocketDataProvider(&data);
+  SSLSocketDataProvider ssl_data(SYNCHRONOUS, ERR_IO_PENDING);
+  ssl_data.expected_ssl_version_max = SSL_PROTOCOL_VERSION_TLS1_3;
+  session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data);
+
+  std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
+
+  TestCompletionCallback callback;
+  auto trans =
+      std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
+  int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+
+  ssl_config.version_max = SSL_PROTOCOL_VERSION_TLS1_2;
+  ssl_config_service_raw->UpdateSSLConfigAndNotify(ssl_config);
+
+  EXPECT_THAT(callback.GetResult(rv), IsError(ERR_NETWORK_CHANGED));
+}
+
 }  // namespace net
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index b3f13b1..1c4d90d 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -2525,7 +2525,6 @@
     { "name": "bit-sentinel.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bitnet.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "buildkite.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "calvin.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cklie.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ckliemann.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ckliemann.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3767,7 +3766,6 @@
     { "name": "atgseed.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "atgseed.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "authint.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "basnoslovno.com.ua", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "basnoslovno.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bettrlifeapp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "billninja.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3870,7 +3868,6 @@
     { "name": "perfektesgewicht.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "perfektesgewicht.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "perplex.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "pettsy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "please-deny.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pm13.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "postbox.life", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3890,7 +3887,6 @@
     { "name": "ryansmithphotography.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schnell-gold.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "selectel.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "sevsopr.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "silver-heart.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "slamix.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "smartpolicingplatform.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6027,7 +6023,6 @@
     { "name": "kirara.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kirschbaum.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kirstin-peters.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kisalt.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "klausimas.lt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kolaykaydet.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "konata.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6688,13 +6683,11 @@
     { "name": "enteente.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "enveloppenopmaat.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "epanurse.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "erawanarifnugroho.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "erotalia.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "erp-band.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "erp.band", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "erpband.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "errolz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "estan.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "esteam.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "euanbaines.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "eulenleben.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7441,7 +7434,6 @@
     { "name": "mediawikicn.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mikeg.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nalao-company.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nodi.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pekoe.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "php-tuning.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "prytkov.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7449,7 +7441,6 @@
     { "name": "s13d.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "saorsat.ie", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sazuz.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "scotbirchfield.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sectia22.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shiftplanning.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shinju.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7700,7 +7691,6 @@
     { "name": "jennybeaned.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jr5proxdoug.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "juhakoho.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kairion.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kaisers.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "karmaplatform.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "katekligys.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9505,7 +9495,6 @@
     { "name": "missrain.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mixposure.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mizi.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mjcaffarattilaw.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mkes.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mkp-deutschland.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mktemp.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9667,7 +9656,6 @@
     { "name": "olymp-arts.world", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "omniasl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "onefour.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "oneminute.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oneweb.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oneworldbank.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "onguardonline.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11245,7 +11233,6 @@
     { "name": "nukute.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "numero-aleatorio.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ockendenhemming.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "oh14.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ojls.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ons.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "onearth.one", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13146,7 +13133,6 @@
     { "name": "kartec.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kasadara.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kashmirobserver.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kat.al", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kateduggan.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kati-raumplaner.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "katproxy.al", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16008,7 +15994,6 @@
     { "name": "clubeohara.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "curtissmith.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "curtis-smith.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "danbarrett.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cleanmta.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bityes.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "correct.horse", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18852,7 +18837,6 @@
     { "name": "schwarztrade.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "scoolcode.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sciencemonster.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "seccom.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pchospital.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "serverlauget.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "security-thoughts.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -19210,7 +19194,6 @@
     { "name": "valeriansaliou.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "viosey.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vorangerie.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "vldkn.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "visikom.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vicenage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vodpay.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -19686,7 +19669,6 @@
     { "name": "blogconcours.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "black.host", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "blogabout.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "biscoint.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "boss.az", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "biovalue.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "britneyclause.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -20926,7 +20908,6 @@
     { "name": "netdex.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "murz.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "neoclick.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nexthop.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nidsuber.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "noncombatant.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nellen.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -20940,7 +20921,6 @@
     { "name": "netapps.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nginxyii.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "numbercult.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nexthop.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nylonfeetporn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nyanpasu.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "neolaudia.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22275,7 +22255,6 @@
     { "name": "grusenmeyer.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gtcprojects.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "guesthouse-namaste.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "guide-peche-cantal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "guim.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "guineafruitcorp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gulleyperformancecenter.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22451,7 +22430,6 @@
     { "name": "maxibanki.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "maximdens.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "maximiliankaul.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "maximov.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "maxkaul.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "may24.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mbs-journey.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22671,7 +22649,6 @@
     { "name": "scriptgates.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sebastian-janich.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "secondbyte.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "secretsanta.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "section-31.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "secwise.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "seeworkdone.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22877,7 +22854,6 @@
     { "name": "witneywaterpolo.org.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wlci.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wmkowa.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "wohnbegleitung.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wolfram.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wollekorb.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wpsharks.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23116,7 +23092,6 @@
     { "name": "aliwebstore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aljammaz.holdings", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aljmz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "allaboutbelgaum.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "allamericanmuslim.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "allcovered.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "allensun.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23692,7 +23667,6 @@
     { "name": "croco.vision", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "crop-alert.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "croquette.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "crossorig.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cruzeiropedia.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cryothanasia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "crypted.chat", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26447,7 +26421,6 @@
     { "name": "www-746.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "www-771122.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "www-jinshavip.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "wxrlab.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wygibanki.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wygluszanie.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wygodnie.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26912,7 +26885,6 @@
     { "name": "betterworldinternational.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "berlin-flirt.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "berthelier.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "better.fyi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bentphotos.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "biaggeo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "beraru.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28339,7 +28311,6 @@
     { "name": "lovetravel360.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "loyaleco.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lodgesdureynou.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "lordofthebrick.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lucid-light.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lojasviavento.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lojamascate.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -30883,12 +30854,10 @@
     { "name": "ispsoft.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "joaosampaio.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "josemikkola.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "invisibles.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "inflexsys.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jawnelodzkie.org.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "italyinspires.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jose.eti.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ivyshop.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jpmelos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jpmelos.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "janaundgeorgsagenja.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31693,7 +31662,6 @@
     { "name": "stavros.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stephensol.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stephensolisrey.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "springfieldbricks.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "steph3n.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sunshinesf.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sonoecoracao.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -33469,7 +33437,6 @@
     { "name": "arethsu.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ariba.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arizonaautomobileclub.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "arjanvaartjes.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arjunasdaughter.pub", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "armeni-jewellery.gr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arnoudraeven.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -38332,7 +38299,6 @@
     { "name": "servers4all.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shellj.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shellshock.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "shoxmusic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sigma-signalisation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "significantbanter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "simpleindianrecipes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40952,7 +40918,6 @@
     { "name": "ybscareers.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yenibilgi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yetishirt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yimgo.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yocchan1513.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yoga-alliance-teacher-training.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yongbin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -41150,7 +41115,6 @@
     { "name": "chatzimanolis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "checkmypsoriasis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cheesehosting.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chicagolug.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chilio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chrislane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "christianpeltier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43419,7 +43383,6 @@
     { "name": "wallacehigh.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wallacequinn.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "waterdrop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "webgaff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weedcircles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wella-download-center.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "welpo.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -47693,7 +47656,6 @@
     { "name": "urcentral.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "use.ci", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uwelilienthal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vacationsbyvip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "varztupasaulis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "varztupasaulis.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "varztupasaulis.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48171,7 +48133,6 @@
     { "name": "intelhost.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "invuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ipssl.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "irgendeine.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isabellavandijk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isarklinikum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isastylish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48855,7 +48816,6 @@
     { "name": "discord4j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dkstage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dns-swiss.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "domain-swiss.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domeconseil.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "donkennedyandsons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doomtech.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -49081,7 +49041,6 @@
     { "name": "klebeband.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koe.hn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koyo.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kroy.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kunstschule-krabax.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kyoto-sake.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lagodny.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50386,7 +50345,6 @@
     { "name": "mivzakim.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mivzakim.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mivzakim.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mixinglight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mlytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mmaps.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mo2021.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52219,7 +52177,6 @@
     { "name": "thebinarys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thebulletin.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thecookiejar.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thefourthmoira.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thefuckingtide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thehoryzon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thelatedcult.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52371,7 +52328,6 @@
     { "name": "xoonth.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yellowfly.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yhfou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yiheng.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yogahealsinc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yourtrainingsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yrjanheikki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52431,7 +52387,6 @@
     { "name": "aquelarreweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arnevankauter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arose.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "arrowheadflats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atelierfantazie.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "austinlockout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "austintxacrepairtoday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53142,7 +53097,6 @@
     { "name": "cursossena.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cybercrime.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cypherpunk.observer", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "deadinsi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "denwauranailab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "devnull.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "devragu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53244,7 +53198,6 @@
     { "name": "lormansas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lucafontana.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lumminary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lunastrail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m-gh.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magic-cards.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magiccards.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55314,7 +55267,6 @@
     { "name": "trustedbody.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "truyenfull.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tuev-hessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tuimprenta.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tweedehandslaptophardenberg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uaci.edu.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ubcani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55560,7 +55512,6 @@
     { "name": "fateitalia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "faultlines.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fbi.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fccarbon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feeeei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feuerwehr-gebirge.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "finkmartin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55606,7 +55557,6 @@
     { "name": "indiecongdr.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "info-screen-usercontent.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "interpol.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "introverted.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "invasivespeciesinfo.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "invinoaustria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "invinoaustria.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57369,7 +57319,6 @@
     { "name": "tonigallagherinteriors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toomy.pri.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toool.nyc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tot-radio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "totaldragonshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "touchstone.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tradeshowfreightservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59059,7 +59008,6 @@
     { "name": "vinigas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vitalium-therme.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vocescruzadasbcs.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "volqanic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vsl.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vulyk-medu.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w889-line.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59454,7 +59402,6 @@
     { "name": "sicurezzalavoro24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "siemencaes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skateaustria.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "skywalkers.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "slatko.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smitug.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smokefreerowan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60922,7 +60869,6 @@
     { "name": "grenlandkiropraktor.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grupodatco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gtn-pravda.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "guchengf.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gx3.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gyakori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gzriedstadt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61380,7 +61326,6 @@
     { "name": "plastic-id.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plumbercincoranch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plusminus30.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "plutonx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ponio.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ponxel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "porncompanions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61819,7 +61764,6 @@
     { "name": "bezposrednio.net.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bicycleuniverse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bioastin.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "biopronut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blackbyte.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blatnice.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blatnice.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62334,7 +62278,6 @@
     { "name": "ninjasquad.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nomaster.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nomik.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "o0o.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onesearay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oolsa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oroscopodelmese.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63847,7 +63790,6 @@
     { "name": "jesiensredniowiecza.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jmwap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jobbuddy.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jpoirierlavoie.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kappie.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kapsalonlinds.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keez.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -64881,7 +64823,6 @@
     { "name": "tvteam.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twwd.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ugy.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "unknown.kyoto", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vdio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "venzagroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "veronicaphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65211,7 +65152,6 @@
     { "name": "tanovar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tauflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tchverheul.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tech-banker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thc-stadvdzon.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thecyberaid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tmadev.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65219,7 +65159,6 @@
     { "name": "topshelf.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "totalaccessnicaragua.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "touhou.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tradavenue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trastornoevitacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tronlaserarena.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tsrv.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65389,7 +65328,6 @@
     { "name": "flexve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "floodsmart.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "floristmou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "forever.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "forthetoys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "founderio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fuzenet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65683,7 +65621,6 @@
     { "name": "acp-integrative.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adarshcloud.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aditibhatia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aduthapa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "advancedelectricalservicesqld.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ae86x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "afree.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65932,7 +65869,6 @@
     { "name": "notequal.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nxcd.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "odden.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "onair.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onlinehaircuts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orthodocspro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ourocg.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66237,7 +66173,6 @@
     { "name": "b2families.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bachkhoa.net.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "badedesign.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "baldy.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ban.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "batiskaf.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "batteryboys.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66472,7 +66407,6 @@
     { "name": "elgrecohotel.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elitsa.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ell888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "email-pipeline.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emigratieplanner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emiliobonelli.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enderle.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66652,7 +66586,6 @@
     { "name": "k8668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaloni.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kartbird.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "karuna.community", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "katieriker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaypasocks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb09.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -68133,7 +68066,6 @@
     { "name": "hingston.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hm5189.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "houhaoyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "howson.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hpvtimmerwerken.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "html2gutenberg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hugonote.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71671,11 +71603,8 @@
     { "name": "109k8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "113k8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "13-th.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "130ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "133ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "135416.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "137kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "155ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "159ks.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "160763.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1661618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71734,7 +71663,6 @@
     { "name": "918eej.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918ia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918yy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "966ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "97735.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "977kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9800.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72032,7 +71960,6 @@
     { "name": "ks2000.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks28.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks28.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks308.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks32.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks36.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks55.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72698,7 +72625,6 @@
     { "name": "233hub.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "23lhb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "291.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "360marketlaunch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "501117.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "7893.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "7894.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73210,7 +73136,6 @@
     { "name": "ariyaoil.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arizana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "assaabloygaragedoors.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "asticon.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asyikbelanja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "augehost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aurbrowser.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73294,7 +73219,6 @@
     { "name": "dtmbx.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dtmbx.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dtmbx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eclypsium.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eddy.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educativetech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edwardsgrounds.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73656,7 +73580,6 @@
     { "name": "uglycat.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uglycat.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unadonna.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "unipart.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unityvox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "upbeatrobot.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "upbeatrobot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73682,7 +73605,6 @@
     { "name": "vthebest9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vuasinhly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w-architectes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wallpapereg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wanekat.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webcaptive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webtex.limited", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73710,7 +73632,6 @@
     { "name": "0013d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0014d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0015d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "0018d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0020d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "002d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "003d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73719,7 +73640,6 @@
     { "name": "007d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "00d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "022kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "027ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "02d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "03d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "03d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73766,7 +73686,6 @@
     { "name": "1120317.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1120319.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1120321.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1120322.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1120324.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1120326.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1120327.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73789,7 +73708,6 @@
     { "name": "1120348.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1120349.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1120350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "113kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1220301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1220302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1220303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73834,12 +73752,9 @@
     { "name": "1220349.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1220350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "127ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "130kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "131ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "132kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "134ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "136ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "150ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "151ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1520301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1520302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73877,13 +73792,8 @@
     { "name": "1520348.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1520349.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1520350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "152ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "153ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "153z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "154ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "156ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "157kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "157ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1620301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1620302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1620303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73927,8 +73837,6 @@
     { "name": "1620343.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1620350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1661618.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "170kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "171kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1720301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1720302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1720303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74020,8 +73928,6 @@
     { "name": "182kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "182ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "182zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "183kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "184kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "185zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "187kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "188zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74032,7 +73938,6 @@
     { "name": "1920305.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2030404.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "222zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "22kb88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3040507.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3040508.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3040517.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74053,11 +73958,9 @@
     { "name": "47d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "48d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "518zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "555kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "555zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "588e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "58w66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "598ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "618btt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "61d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "62222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74066,7 +73969,6 @@
     { "name": "65d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "666zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "66d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "66kb88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "70872.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "70d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "74d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74077,7 +73979,6 @@
     { "name": "8006d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8007d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8008d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8009d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8010d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8011d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8012d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74085,7 +73986,6 @@
     { "name": "8015d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8016d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8017d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8018d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8019d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8021d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8022d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74104,31 +74004,14 @@
     { "name": "8077d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8078d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8092d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8097d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8100d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8102d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8102d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8105d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8109d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8113d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8113d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8116d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8116d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8121d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8121d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8153d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8159d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8160d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8160d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8161d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8161d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8163d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8165d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8167d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8170d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8173d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8182d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8183d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8197d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8198d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8200d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74145,8 +74028,6 @@
     { "name": "8802ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8805ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8809ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8820ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8825ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8830ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "886666b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "886666d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74240,7 +74121,6 @@
     { "name": "amtsinfo.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andrewjphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "animekaizoku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "anti-spy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anxietyspecialistsofatlanta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anythinggraphic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aptekakolska.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74293,7 +74173,6 @@
     { "name": "calendriergn.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "careerdirectionsltd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ccuuu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cellphonemiami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cheapsharedhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cheapsharedhost.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chicourologist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74301,7 +74180,6 @@
     { "name": "chrisseoguy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "christianmoore.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "churchofsaintbenedict.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ciel.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ciliberto.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "claimflights.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "claimflights.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74319,7 +74197,6 @@
     { "name": "computerguardians.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "corsisicurezza.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cuteselfie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cyber-shield.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d8812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d8812.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d8813.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74449,7 +74326,6 @@
     { "name": "doesinfotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "donghochinhhang.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dragontours.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "driver-updater.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dsreal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dzu.fund", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "e901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74461,7 +74337,6 @@
     { "name": "ecmatching.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eiadaladel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elranchofeliz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "engelmann.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enigmadjradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eos-utvalget.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ermessecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74474,9 +74349,7 @@
     { "name": "fireflyiii.spdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "firerain.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "firmajulegaver.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "first-aid-kit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fite.family", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "forensic-system.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "funkydealz.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gardensquaredental.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gay-personal-ads.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74499,7 +74372,6 @@
     { "name": "hua-chuan.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hua-chuan.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "icasebr.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "identity-inspector.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iflyi.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ikisser.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ilovestickers.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74519,7 +74391,6 @@
     { "name": "itdutchie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jaculus.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "japansm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jcphotography.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jehelpdesk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jeps.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jeroendev.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74530,12 +74401,9 @@
     { "name": "karimunsejahtera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kartikmohta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kashbet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kashpoker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb4393.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kb88111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb882.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kb88555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb8878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb88818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb8885.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74550,7 +74418,6 @@
     { "name": "kiousis.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kirkwood-smith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kisser.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kletswereld.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "klupper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "korob-ok.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kreyolgym.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74560,10 +74427,8 @@
     { "name": "ks1519.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks162.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks181.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks201.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks202.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks206.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks382.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks5888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74574,31 +74439,20 @@
     { "name": "ks8805.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks8809.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks8810.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks8821.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks8829.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks8832.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks8835.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks8836.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks8851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks8852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks8859.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks8860.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks8865.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks8881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks8882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks8883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks906.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks907.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks920.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ksbet168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ksvip01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ksvip03.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ksvip10.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ksvip11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ksvip15.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kuscheln.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "larpkalender.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74609,7 +74463,6 @@
     { "name": "lilai5566.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lilai838.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lilai99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lilaiw66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "linosky.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "littles.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lkw-servis.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74619,7 +74472,6 @@
     { "name": "lofstad.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loheprobado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long-8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "long-9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long113.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long139.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74628,7 +74480,6 @@
     { "name": "long266.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long288.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long510.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "long566.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long566.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long68.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74665,9 +74516,7 @@
     { "name": "monsitemoncommerce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moorelawfirmaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "motornaolja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "moviejack.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mrnathanpowell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "myformatconverter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mysasiedzi.bialystok.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myunicornshops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "n886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74704,8 +74553,6 @@
     { "name": "petrovich.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "philanima.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phongthuyanthinh.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "photo-blowup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "photomizer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "photosaloncontest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pignus.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "podsvojostreho.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74814,7 +74661,6 @@
     { "name": "vinmmo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voevm.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "volvoconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "w0181.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w0185.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w0189.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w0191.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74837,7 +74683,6 @@
     { "name": "w66918.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w6698.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w6886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "w81518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wallisch.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wearefrantic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "websiteboost.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76370,6 +76215,4602 @@
     { "name": "zlhgc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zlhuodong.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zltymacau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "00004048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000a1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000a2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000a3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000a5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000a6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000a7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000a8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000a9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000x2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "000x3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "001yapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "00228.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0022bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "009597.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "00b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "01234048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "012345678365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0123456789365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0138365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0139365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0165365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0175365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0185365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "018663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0195365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "038456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "038663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0393ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0393gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0393hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0393ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "03region.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "040552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "041552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "042552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "046552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "049552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "050.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "050a1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "050a2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "050a3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "050a4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "050a5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "050a6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "051552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "054552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "065l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0681z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "068552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "068663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "071552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0737399.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0768ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "078663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "083832.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "084552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "085851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "093113.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1-345.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1003365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "100pudov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "100visits.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "107996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "10n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1112365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1116365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1119365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "111b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1120344.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1188bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1190america.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1199bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1220323.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234365z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "12344048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "12345678365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "123456789365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1234a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "123seo.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "12n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131365qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "142552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "146552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "146773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "148663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1517598.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1517668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1517669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1517883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1517886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1517889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "153kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "154552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "154922.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "16-qw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "16qw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "16region.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "178btt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1831365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1832365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1834365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1837365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "188kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1981365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990uu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "19990zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1baks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1cprosto.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1hfree.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1malaysian.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2-678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2012review.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2013review.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2015review.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2018fifaworldcup.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "202jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2033z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "205jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "207ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "207vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "209vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "20n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2155hg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "216vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "22245j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "22256j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "22267j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "22289j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "222b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "228668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2288bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "22b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "23454048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "23732.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "240vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "241552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "242552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "246773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2484811.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848188.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2484822.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2484833.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2484855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848a.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848b.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848c.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848d.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848e.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848uu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848v.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848w.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848x.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848y.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848z.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24848zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "248663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "25may.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27878zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "284365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2evip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2kvn.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2lovebirdsblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3-789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3-800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3006789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "30n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3165365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3175365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "317811111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31782222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "317822222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31783333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "317833333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31784444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "317844444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "317855555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31786666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "317866666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178666666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "317877777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178888888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31789999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "317899999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3178yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3265623.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "333b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3344985.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "335a.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "33b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "33n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "348663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "350vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "351365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3539783.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3557365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3558365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3559365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "360365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "362590.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3650607.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658200.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36588801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888012.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36588812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36588823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36588834.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888345.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36588845.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36588856.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36588867.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36588878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36588889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36588890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888dddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3659801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3659867.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3659868.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3659869.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3659980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365eib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365eif.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365eil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365eiq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365eis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365eiv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365eiw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365nnn.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365nnnn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365r.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365rr.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365xxx.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y00.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y77.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365y99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365ypw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365zg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365zg.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365zzz.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "369-7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "37987.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3800611.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "380111000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "380111111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "380111222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "380111333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "380111444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "380111555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "380111666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "380111777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "380111888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3809955.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "382228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "38irkutsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "391231.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "392365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3957z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "396301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "396302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "396303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "396304.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "396305.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3963aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3963bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3963cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3963ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3963ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970200.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970300.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970400.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970500.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970600.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970700.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970900.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970uu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "39news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3danimation.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3djava.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3w-solutions.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4001365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4002365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4003365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4004365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4005365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025361.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025362.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025363.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025364.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025366.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025367.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025368.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025369.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4025y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "40481234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "40482345.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "40484567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "40485678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "40486789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048ggg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048kkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048lll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048mmm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048ooo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048ppp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048qqq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048rrr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048sss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048ttt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048vvv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048www.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048xxx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048yyy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4048zzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "408663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "40n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "416365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "418663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4233330.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4233331.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4233332.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4233334.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4233335.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4233336.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4233337.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4233338.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4233339.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "426773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4345.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "436773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "438663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "443658.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "444b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4455bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "44b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "451365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "456-3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "45674048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "458663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "476773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "486773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "497552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "498663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4best.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4dillusion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4evip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4tgw34.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5-600.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5-890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "500wordessay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5017503.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5055990.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "51365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "51365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "51365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "51365bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "51365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "51365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "51365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "51365dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "51365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52002y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "520xpjxpj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "538vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "55554048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "555b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5566bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "55b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "55ks.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "55n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "56784048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5898657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "593-7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "59759vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "59759z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981611.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981622.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981644.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981655.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981667.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981677.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981811.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981822.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981833.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981844.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5981z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "59859h.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "59859j.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "59859k.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "59859l.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "59859y.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "59859z.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "598877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "59rus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5ilg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6-600.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6-800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "605vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "60n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "611121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "611125.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "611165.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "611195.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "616675.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "616btt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "621nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "621vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "628vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "635-488.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "635-588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "635-788.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "635-888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "635-988.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365ah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365am.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365bj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365cq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365fj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365gd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365gs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365gx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365gz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365hb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365hk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365hlj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365hn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365jl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365js.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365jx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365ln.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365nmg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365nx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365qh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365sc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365sd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365sh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365sx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365tj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365tw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365xj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365xz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365yn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6365zj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "63960000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "63961111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "639611111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "63962222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "639622222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "63963333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "639633333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "63964444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "639644444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "63965555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "639655555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "639666666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "63967777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "639677777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "63968888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "639688888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "63969999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "639699999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396ggg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6396jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6520265.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "657843.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66321z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365a.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365b.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365c.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365d.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365e.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365f.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365g.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365h.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365i.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365j.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "663365k.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "664048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "666111bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "666222bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "666333bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "666555bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66664048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "666777bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "666888bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66689j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6669255.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "666999bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "666b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "666btt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6671365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6672365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6673365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6677bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "677314.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "677340.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "677341.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "677346.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "677347.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "677354.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "677364.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "677384.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "678365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "678678365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "67894048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "67y7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "681vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "68522.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "68522c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "68522k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "68522m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "68522s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "68622.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "68622a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "68622b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6863070.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "68722.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "7-890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "7004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "70365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "70n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "7111365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "71365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "721aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "733575.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "73365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "74365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "753-9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "75365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "755204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "755243.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "755245.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "755246.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "755249.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "755274.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "755284.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "755294.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "755a.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "76365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "76678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "769k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77018aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77018bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77018cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77018dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77018ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77774048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77789j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "777btt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "7788bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "78365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "78365app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "78365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "78365bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "78365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "78365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "78365dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "78365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "7888813.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "7888815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "7888821.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "78904048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "789451.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "789453.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "789455.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "791188.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "792ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "793ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "80365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "805vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "80651a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "80n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "811121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "812221.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "81365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "82781111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "82783333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "82784444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "82785555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "82786666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "82789999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278ggg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8278yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8286hg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8289hg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "83365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "842365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "846773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "848663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "852-7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8521.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8521.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8602012.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8602013.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "860vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866300.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866304.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866305.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866308.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866314.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866341.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866346.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866349.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866374.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866394.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "87365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878365nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "878989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8810ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8836ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8855650.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8855950.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8866012.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88740z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8881234j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8882345j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "888234j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8883456j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "888345j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8884567j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "888456j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "888567j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8886789j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "888789j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88884048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "888b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8914499.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8b8888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8btt.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8me.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9009019.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "906vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "908vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "90920.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "90n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9110365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9111365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918-siteinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918101.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918aait.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918aav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918aff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918agr.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918arr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918baa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bbg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bdd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bip.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bis.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bit.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918bzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918cce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ccq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ccs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918cct.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ccu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ccv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ccw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ccz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918cdd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918cgg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918cjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918cmm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918crr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918css.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ctt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918cvv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918cww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918cxx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918dbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918dcc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918dde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ddf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ddj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ddo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ddp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ddq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ddr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ddw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ddx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918dkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918dpp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ebb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ecc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918edd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eef.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918een.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eeq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918eez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ejj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918emm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918epp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918err.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918euu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918fdd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918fee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ffa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ffb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ffc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ffd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ffe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ffh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ffn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918hi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918hw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918iwo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918jt.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918jwo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918lwo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918mh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918mo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918mz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918mzoz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918pt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918qg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918qi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918rs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918rt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918sj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918ze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "91d91.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "940365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "946773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "953-7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "956jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96002.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "961705.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "966ty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "97736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "97737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "97738.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "97739.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9836952.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "988316.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "99123j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "99456j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9977432.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "99789j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9988551.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9988959.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "99994048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "999b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "99n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a365vip1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a365vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a365vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a365vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a365vip7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a365vip9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a66.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6619.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6621.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6623.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6627.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6631.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6632.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6651.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6652.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6659.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6671.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6672.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6673.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6675.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6682.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6683.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6687.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6691.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6692.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a6695.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aa4888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aa7666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aa793.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aadv.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abanilla.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abc-solutions.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abc001.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abcode.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abdullahzubayerofficial.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abdurrahmangazidis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abdurrehman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abhishekkabdijain.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abitech.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "about-bangladesh.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aboutshakil.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abrahametalero.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abrightspark.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abth.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "academy-awards.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "accesoriosviaje.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "accordable.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "achinsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acrobatic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acyclovir-cream.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "addnewsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "addyourlink.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adrian-riemer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adriatrans.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adrino.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adsviews.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adventry.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advokat-malinovskii.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advokaty-onlajn.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advokaty-yuristy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "affektblog.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "afganistan.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "afghan.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aflebedevo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "africalebanon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ag66321.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ag878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agarioforum.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agenux.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agiosthomas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks116.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks135.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks139.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks158.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks16.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks966.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agrargruppe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agroplas.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agul.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aido.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airwolf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ajman-realty.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ajs5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akhabar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alantica.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alargarlavida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alaskarsbc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alatkesehatan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "albalatedelarzobispo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "albaniaonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alcamilo.cloudns.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aleftinka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alevi-forum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alevi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alexsandrasverden.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alfonsostriano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alisondavenport.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aliziolaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alko-stop.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alkor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allaboutreligions.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allcat.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allenwillis.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allfaucet.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alliance-clan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allo-luxembourg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allopurinol300mg.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allright.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allwiki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alpha-centauri.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alsops.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "altergalaxy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "altisnet.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "altos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amberoad.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ambrosio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amitriptyline-hydrochloride.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amphost.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anachronis.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anagramma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andrewmcfarlane.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anekdot-pr.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "angepsychedelices.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "animalz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anime-drift.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "animedon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anirvalle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anonaddy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anonser.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anothermusic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antalyaescortyaren.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antarctica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antarctida.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antarktida.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anti-nsa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antihistory.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antijob.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antonoff.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apart-hotel-weimar.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aperturelabs.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apkpokemongo.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appworld.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apustaja.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aquabyte.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aquadecor.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arabia-news.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aral.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arandinacf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arcanetides.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "archbishop.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "archwood.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "argumentative-essay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arheh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arielpereira.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ariixmex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aripiprazolee.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arithmetic.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "armcar.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "armeniaweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "armtopnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arpumpsonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "art-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artcaly.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artcar24.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arti-islam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artificialplants.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artitbe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asdyx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiasmi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asjas.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "assemblage.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "assignacii.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atayia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atfstudios.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "attractieparken.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "augesen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "australianonlineappliances.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "auto-skills.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autokeyinaustin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autorama.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoresponder.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoschool.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autotyreprest.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autovesti.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aviconverter.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avto-signal.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avtoucheba.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avtoyurist.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "awningsydney.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aypotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "azenot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "azerinews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "azora.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b-honey.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b0000.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b0305.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b0306.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b0307.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b0308.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b0309.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b03aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b03bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b03cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b0607.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b0708.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b1111.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b3177.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b31aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b31bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b31cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b31dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b31ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b31ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b3333.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b3390.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b3391.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b3392.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b33app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b36510.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b36512.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b36513.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b36516.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b36517.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b36518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b36519.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b36520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b365k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b538.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5706.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5707.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5708.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5709.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b57bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b57cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b58365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b58app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b58appb58app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b58appb58appb58app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5902.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5903.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5904.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5906.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5907.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5908.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5909.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b5910.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b62h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b6701.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b6702.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b6703.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b6704.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b6705.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b6710.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b6720.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b6730.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b6740.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b6750.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b67771.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b67772.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b67773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b67774.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b67775.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b68.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b7306.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b73app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b73bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b73dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b73ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b73ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b750.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b7501.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b7502.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b7503.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b7505.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b7506.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b7507.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b7508.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b7509.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b830.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b83kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b8831.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b88aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b88cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b88dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b88ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b89ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b89gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b89hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b960.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9902.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9904.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9912.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9951.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9954.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9957.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9961.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9962.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9967.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9970.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9973.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9976.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baby-massage.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babybuddah.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "backgroundscreenersofamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bactrim-antibiotic.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bactrim.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "balaganlimited.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "balakovo-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ballast.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baloncestolliria.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baranmovie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "barao.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "barganhanaweb.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baseerapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "basketball-malavan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bazar.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bb057.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bb087.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bb211.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bb321.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bb882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "be4lead.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beachpoint.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beatuprobot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beautyspot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beaver-creek.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beebeads.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bellecarmen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bellevueowners.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "belquant.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bembee.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benatherton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benazir-reaction.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benetcasablancas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "berksnetworking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bernudrebes.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "best-book.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestboot.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestechgadgets.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "besthemes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestkeys.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestmedsmmj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestofbooks.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "besttrade.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestwebcams.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet01vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet02vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet03vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet04vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet05vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet062.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet064.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet06vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet074.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet07vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet08vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet09vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet10vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet261.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet290.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet3602.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet3607.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet3639.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365bc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365cnq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365cnr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365cns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365cnt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365cnu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365cnv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365cnw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365cnx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365cny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365cnz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365g8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365n1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365n2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365n6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365n8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365n9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365q0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365q6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365q8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365q9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365r8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365vip1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365vip6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365vip7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365vip9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365x0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365x1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365x2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365x3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365x6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365x8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet365x9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet599.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet66669999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet666888.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet721.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet916.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betaa0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betaa1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betaa2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betaa3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betaa5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betaa6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betaa8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betaa9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betb33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betb73.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betxx1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betxx2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beverly.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beylkin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biaxin.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bigdiscounts.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bigprintinglasvegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bigthunder.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biletvkrym.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "billcompare.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "billcomparison.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "binf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biodobavki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biomeris.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bionicman.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biosearch.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bisix.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitgain-leverage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitmag.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitstage.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biz-secrety.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biz-secrety.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biz-seecrets.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biznes-sekrety.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biznes-sekrety.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biznes-sekrety.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biznet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blackoutzone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blacktubes.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blic-zajm.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blogaram.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blogcosmeticsurgeon.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bloodpop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bluesnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bobcoffee.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bodaneiranunez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boffin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bogwitch.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bolsa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bonaemi.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookslibrarybooks.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bordo.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boredhousewifeconfessions.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bornreality.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bosattondskap.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boxdropcc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boykovo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bozhok.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brainobeat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brainshare.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "branode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brasiltopnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bratunaconline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bravica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "breakcraft.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brest-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brestnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brezani.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brianvalente.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brianwilson.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bridalweddingshow.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bringingbackthesweatervest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "britania.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brosay-legko.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bruce-springsteen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brusselsexpoloft.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brusselsexpostudio.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bryanarmijomd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bt3655.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bt3657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bt3658.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bta22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bta88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bte365app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bteapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt0101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt0505.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt0606.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt11.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt1515.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt175.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt187.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt216.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt221.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt222g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt226.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt2323a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt236.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt238.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt2525.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt273g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt2929a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt494g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt583g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt6363a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt6868.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt690g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt7272a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt7878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt829.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt830g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt8787a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt888g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt889g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt918958.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btt9494.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btta16.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btta26.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bttp7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buddy-acceptance-authentication-api.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buddy-acceptance-profiles-api.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buddy-acceptance-users-api.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "budgetboats.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bulgariablog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bulgariya.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bulvar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bungabuket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buquesdeguerra.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buselefante.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bushland.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "business-secreti.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "business-secreti.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "butterhost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buy-an-essay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buy-essay-online.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buy-lasix-without-a-doctor-s-prescription.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buy-los-angeles-auto-insurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buy-neurontin-online.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buy-seroquel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buy-sildalis.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buy-zofran.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buycitalopram.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buydiflucan.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buydiflucan.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buyfluoxetineonline.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buylasix.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buylevaquin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buymethotrexate.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buyrogaine.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "byemeds.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bystryj-zajm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "c30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cabecera-descendimiento.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cabelgrano.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cabezadelcaballo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cafenix.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calaverasmedicalcannabis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calcioragusa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calposa.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cambodiainfo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cameraslyphotography.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "camisado.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canhq.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cantosdisidentes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "car-speed.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carfinans.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caribuku.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carmeni.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carolicious.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carousel.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carrabiners.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carsshop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cartfilm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casalcrevillent.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casalinghedisperate.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casalribeiro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "castalie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "castle.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "castleoblivion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "castrillodelavega.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catalojic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caterbing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catiadecastro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ccblicense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ccc88.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cctv-supraveghere.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cdlinares.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "celadas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "celebritytopnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centrum-edukacji.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cesium.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chardik.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaussurerunning.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaussuresmarche.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheap-life-insurance-quote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapmedrol.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chefpablito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chezbernard.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinastory.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chispita.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chitinfo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "christianblog.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chrixonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuvashia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cilacapnews.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cinemadoma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cinexmachina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "city-forums.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clickforum.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clickphobia.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cliffburton.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "climatizzatore.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clipperses.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudninelandscapedesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "club-leondehuanuco.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cm-loures.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "codeidea.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "codesgroup.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coeurdesushi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coginti.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colchonminicuna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colley.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comeoneileen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comlipa.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "communist-party.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comprarcarteras.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "compu-ofertas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "compusrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "computeradvance.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "condit.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "configurat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "conflicting.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consoleuniverse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coolmath.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coomonte.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copycenter.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copywriting-on-demand.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "correctionsfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corvee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cosmetique-totale.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coth.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "countrysidemarquees.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cpegypt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cpsa.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cracksnet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crafttalk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "craig-mullins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crapmail.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crazyhost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creditif.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creditor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cristals.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cristianonascimento.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cross-culture.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crvegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cubanchino.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cubigames.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cucaracha.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cursomarketingdigitalmx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "customessaystation.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "customradio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cutlinks.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cutmylink.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyber-yaroslavl.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cybercat-tver.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cybercave.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cybergame-host.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberium-planet.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cybermaniac.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberpanel.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberphoenix.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberquest.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cybersound.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cytat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d-consultant.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d-soft.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d588.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d88.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daemon-hentai.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dahobo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dailynewsclubs.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dairikab.go.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dajiadu8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dakota-spain.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dale-bancruz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danceylove.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dannygaidateraelgar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dannyjota.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dapoxetinagenerico.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dassolutions.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dataman.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datenendlager.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datingsrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dcareer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "de-mossadeq.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deantiguos.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "debauchery.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "debitterballetjes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deblocking.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dedmoroz.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "defektologiya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "defifa.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "defterikebir.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deine-gitarre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deinelakaien.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deionized.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "delcan.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "delcan.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dellacasapizzasemassas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dementieva-pennetta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demicrofonos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demirdokum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "democracy-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "denegmnogo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "denejki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dengivdom.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dentals.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "denvernews.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "departmentofoncology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "depelteau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "depleteduranium.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "depositomerci.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "derango.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deshevle-net.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desportvriendenoverijse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "destroymc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "detiks.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "detki.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "detreannamaria.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "detyamobuv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "detyobuv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "devcore.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "devildog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "devils-co.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "df5101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "df5102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "df5103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "df5104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "df5105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "df5aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "df5bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "df5cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "df5dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "df5ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dfc52.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dieta-figura.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "differentgirleveryday.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dimitrovi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "directed.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "directlendingsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dirk-dogs.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "disabuse.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "discodery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "disconnect.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "distancelove.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dities.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "divistart.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dixi.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dj16888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dj16888a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dj16888b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dj16888c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dj16888d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "djfafafa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dji-ars.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "djlove.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "djslash.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dlyaribalki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doc-baza.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dockysearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "docogo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doctornaima.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doddy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dodikod.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dolce-vita-mia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doll.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domain-skachat.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainforfree.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainhostingcompany.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domlist.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domoset.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "donaldtrump.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doradoscampeon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dorogaminina.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dostav.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dosyanet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doubleness.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "downloadfiles.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doxycyclineprices.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dragon31.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dranik.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dream-pools.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dreamcrack.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dreamwork.financial", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dreamworldstudio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drianpublishing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "driv.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drivingacademy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drunkendropkes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dubaizone.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dubrava.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "durcal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "duxi-s-feromonami.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dy1d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dynamofanforum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dzus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-diabolo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-fishing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-informatyk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-peets.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-yachts.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e007.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "earningthatis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "earthcorporation.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easyshare.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easywin.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eblog.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eburg.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecbt.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eco-flowplumbing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eden-project-insight.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edgarz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "educationtree.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee362.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee367.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee371.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee372.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee373.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee397.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee575.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee631.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee632.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee651.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee652.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee653.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee735.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee951.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ee973.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "egonix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elcin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "electroforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "electromagnetism.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "electronicssrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "electroworld.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elektromotor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elephantia.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elikers.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elite-design.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elriacdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "em888.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emersoncanada.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "endlesswebsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enerypa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "englandschool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eniziolab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enoisdaturma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enrack.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enrique-monroy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "entertainmentblog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enwikipedia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "epal.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "epicenter.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erasure.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erevan-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eridas.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ersinbiltekin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "escueladego.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "esmejor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "essay-writing-topics-fce.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "essaymaker.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "essenerbaeder.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "estaryshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euman.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euroshop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eusarse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evadental.institute", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eveaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eventosformativos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "everberg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "everglowtrading.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "examsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "examticket.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exciters.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exotic-bengal-cattery.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expert-voronezh.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expertpaintersvt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "explosionstereo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expouniverse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exsanio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "extremfrank.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eyetooth.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ezik-ido.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9850.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9854.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9880.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9884.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f9885.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "factslider.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fairyth.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fake-show.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fakes-ru.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fakt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fall.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fanclubrbdmaniaromania.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fantasyfoot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "farberplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "farmaspeed.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fashionlistify.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fasturl.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "festivalpopayan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ffvideo.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filesuffix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fimozin.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fimp.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "finance-news.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "findlocalproduce.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "finestrabatalera.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "finlito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fioritic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firenews.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fizadvocaten.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fkraiem.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flamengopi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flashgamedev.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "floorballphilippines.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "florenciasabio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flyawaybirds.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "folar.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "footballsrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ford-mustang.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forfeit.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forum-egypte.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forum-gilee.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forum-noginska.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forumirc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forumpakistan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fotofon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fourscore.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frail.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fralippolippi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frankieburkeactor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frankieruiz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "free-bitco.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "free-generate.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "free-traff.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freebegames.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freedogecrypt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freedombankva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freedomisslavery.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freemotion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freetrung.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freifall.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freiwuppertal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fruit-farm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fukt.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fungomoscow.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "futbol-tv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fyss.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "g30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "g365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "g3homefoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "g47.web.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "g51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gablesportsga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gabryjeluk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gadgetstock.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaelico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gagramore.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galaktika-znakomstv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galaxyplex.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gamerspost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gameserver-admin.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gamingx.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gammaphibeta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gastronom.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gathegi.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gazoz.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gdesemena.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genen.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geoffnussmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geonice.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "georgekaraoglanis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gerbang-singkolo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geroiplavska.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geschaeftsideen-ebook.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "get-california-real-estate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "getpromo.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gfac.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gfronline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giovannarossi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "givepenny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glebov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gnezdo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "go-kuwait.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "godall.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gogomail.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldenage.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goquiqstatus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gorodrostov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gosaavd.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goug1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goug3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goug6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goug7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gougeaway.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gpswebsoft.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gpz500s.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grafik.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greeknewspapers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grekiskagudar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "griffinsrfc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grilllness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grokandtonic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grumpyseb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grupdedansa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grupoauxteclic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gruzoperevozki.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gugs.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guidethailande.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guillen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guitarangel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gunerds.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guzelforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gvitebsk.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gymnastic.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gyroscopicinvesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h6852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h6853.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h6895.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h6913.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h9386.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "habernet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hackthat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hair-guide.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haircutideas.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hakimova.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "halilweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handymanbypolli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hardrock.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hb6365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "health24world.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "healthystyle.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heijmans.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "helbreath.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "helloafrica.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herqqq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hexsafe.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg2018hg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg61388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg62388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg67388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg67855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg67877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg72988.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg97188.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg97288.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg97388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg97588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hg97688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hiddenimage.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hieisuki.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hightechreviews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hilarious.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hindibaba.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hindu-temple.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "holini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hollywoodstars.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "homophobia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "honeybrooklibrary.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongorw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongosdemexico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hoon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "host4me.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hostingdirectory.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotelsrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "housedesigninfo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "houstongaragedoorsrepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huaxingui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hydrasecurity.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyhy1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyhy2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyhy7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyhy80.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyhy81.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyhy82.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyhy83.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyhy85.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyhy89.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyhy98.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "i30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "i365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "i36588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "i51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "i7sas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iamwill.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "icelandic.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ient.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ifconfig.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ifiveglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ifolder.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ignatij.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ikari-san.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ikx.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilg.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iligang.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iligang.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iligang.net.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilovesamara.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iloveyoutoo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilug-ktm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilumantio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imolights.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inalvittile.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inbound.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indexmarket.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indiafm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indianapolisnews.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indianerschmuck24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indigobooks.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indigostudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indonesian-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indospot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infinitelightofbeing.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "info-bolivia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "informat.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inglesencanada.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inin.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inlineskating.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "innico.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insiberia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intercrosse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internet42.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internetmagaz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intimznakomstvo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ip40.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "irajsingh.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iranfilmcity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iranonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iraqinews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ireland.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "irob.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ironraven.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "isae-supaero.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "isae.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "islamabadcourt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "islamnewss.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ismadgeintrouble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "israelnewswire.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "it4sure.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "italiatopnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "italik.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itezu.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ittgame.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itzkavin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iweathernet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j32661.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j32662.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j32663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j32664.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j32665.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j32771.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j32772.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j32773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j32774.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j32775.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j5563.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j5573.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j70111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j70222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j70333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j70444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j7051.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j7052.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j7053.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j70555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j8846.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j9943.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jackrussel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "janelle-jamer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "janellequintana.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japantravel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "javaexpert.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "javiermascherano.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jennifertilly.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jerisandoval.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jesseonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jesusvasquez.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jino.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinsha1234567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinsha12345678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinsha168.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinsha2228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinsha2288.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinsha66669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinsha6969.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinsha8888888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinsha99999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "johan-koffeman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "johnpenny.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "johnpenny.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jolfamarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jomsolat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jongcaxent.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jongtonghapkido.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jose-latino.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joseenriquegonzalez.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "josefernandomorilloardila.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "journeyfitness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jovenescontraelaburrimiento.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jqk918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "js636.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "js637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "js638.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jsidefox.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "julia-clarete.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jungyonghwa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "juppy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "just-heberg.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "just-keep-swimming.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "justknigi.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "k1958.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "k30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaatsen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kabachok.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kafel-ufa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kai-ruecker.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaishi001.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaishi007.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaishi008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaishi03.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaishi06.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaishi66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaishi998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kak-pohudet-legko.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kalashnikov.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaliningrad.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kalsa.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kandhamal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karantholdings.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karapuzz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kashbet666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katalog-serverov.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katalog-tovarov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kathleendeisher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb021.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb0303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb035.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb036.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb06.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb07.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb1515.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb2727.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb283.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb3131.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb3434.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb3535.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb4141.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb4242.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb4343.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb4747.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb506.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb5252.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb5656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb5pt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb673.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb702.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb7070.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb7474.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb7676.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb786.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb864.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8811.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8816.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8828.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8869.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8887.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8898.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88dc01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88dc03.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88dc11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88dc24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88dc27.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88dc29.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88md07.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88md13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88md18.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88md19.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88md30.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb896.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb930.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb963.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb965.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb9696.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb975.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kbhgi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kbty0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kbxlu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kegelschiene.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kemerovo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keramed.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ketoconazole.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kevinvanderperren.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keyworth-meadow.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "khakasiya.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "khakasiya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "khakassia.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "khakassia.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "khakassia.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "khakassia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kilo-files.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kimberleythomson.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinglier.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kino-doma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinodrom.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinosha.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinovsem.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinozone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kirov.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kirovcity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kirovgrad.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kismy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kleinhaneveld.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koba.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "korancode.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koroleva.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "korund.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "krakozyabra.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kravmagaangers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kresimir-blazevic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kryptologie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks-19.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks-39.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks-49.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks-59.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks-79.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks01.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks016.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks017.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks02.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks023.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0316.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0318.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks038.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0404.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks05.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks051.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks053.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0566.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks06.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0660.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks07.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0718.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0758.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0766.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0768.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0770.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0778.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks08.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks080.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks082.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks083.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0833.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0838.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks085.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks087.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks09.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0977.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0990.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks1010.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks143.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks156.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks182.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks191.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks196.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks209.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks210.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks213.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks214.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks256.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks257.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks2626.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks281.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks282.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks285.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks286.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks288.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks2888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks2888.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks296.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks298.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks299.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks318.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks330.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks335.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks337.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks338.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks338.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks339.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks3535.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks3737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks380.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks381.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks383.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks385.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks386.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks388.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks3939.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks4040.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks4242.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks5014.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks5050.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks506.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks516.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks5353.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks541.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks549.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks556.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks556.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks5606.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks596.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks597.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks600.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks602.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks626.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6363.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks641.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6565.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6690.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6767.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks687.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks69.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks692.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks7272.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks7373.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks79.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8186.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8383.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks88.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8819.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8820.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8826.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks883.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8839.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8862.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8869.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8884.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8885.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8887.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks89.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks9.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks915.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks9393.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks960.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks9696.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks9797.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks9888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks99.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks996.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kst-service.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ksvip02.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ksvip04.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ksvip09.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kswinwin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ktuluweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kukeri-karlovo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kupislivki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kurd-online.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kurgancity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuznica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kylie-pomada.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kyrylych.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "l30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "l3l365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "la-paco.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "labandadelamente.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lablnet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lada-granta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laencina.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laramewa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lasdelgadas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lavozdelamusicachilena.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lbc-podcast.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ld66999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ld699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ld6999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "learnhowtoplayguitar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "learningladderacademy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lesbianlovers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "letaman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "letdownloads.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leu365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lg.gz.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "li.gz.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liberty-city.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "librarium.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libruis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lifekirov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liftmastercloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lightcraftmc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lightfoot.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "limbaido.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "limitlessinteractive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lindgrenracing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linestriperdepot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linkwheel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linonin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lion7.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lipacom.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lisadelbo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "littlelucifercafe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "livelink.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "livenewsrussia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locabir.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lockerroomstories.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locksmithservice-humble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locksmithssanmarcostx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locksmithstaffordtx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locomen.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "london-mafia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "long8079.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lorimullins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lorisfnotary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loveismystyle.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lucarautti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ludolust.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luizlopes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lukaszuk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lukaszuk.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lukezweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lux-house.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luxhome.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lyna.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "m30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "m365m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "macon.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madeira.gov.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madgeandpaul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madgech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madgeisawesome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maewongaming.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magaconnection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maggot.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magic-cheerleading.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magisternegi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mailinabox.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maladie-autoimmune.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "malariaadvice.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maleperformancepills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maltasite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maltaultrastifo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mangaworld.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marblemosaics.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "margolis.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mariahandnasty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marufmusic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marvaco.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masalaband.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masdemariette.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mass.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mathiteia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mati.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matthieuchedidweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matuslab.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mauriceje.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maveeranpasupathi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max-apk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max-phone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max00365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max0365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max11365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max1365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max22365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max2365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max33365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max3365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max4365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max44365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max5365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max55365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max6365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max66365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max7365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max77365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max8365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max88365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "max9365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxclean.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mayito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mayre-idol.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mazavto.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mbetb33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mbetb73.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mbetbtt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mbte365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mbtt365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "me-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "med-line.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "medalofvalor.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mediagetnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "medichat.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "medivox.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megawebsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mehibo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "melatonin.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "melda-agustin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meliyb.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mesabi.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metaljournal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metalliran.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metrodemaracaibo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mevsim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mezedokamomata.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "micontractortraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mido.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miguelito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "milan-news.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "milavica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "militarysrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "milkmoovement.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mill.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minaio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minibrewery.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mink-coat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miragg.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mirkvartir.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mitiad.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mix-channel.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miyanaga.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mkbet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mmcalc.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobileague.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobinst.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobsitin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobtop.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moburst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mogica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moldova-online.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moldovanka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moldovawall.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "molodost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "momocrats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moneta-rossii.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mongolbox.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monkeysorce.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mononom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moonwolfwiccanschool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moraldehornuez.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moroccanews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moroccotodaynews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mortengamstpedersen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moscow-moscow.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moscow-new.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mosnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mostlymuttz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "motoscascos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "motun.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mrlove.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "muhabbet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mullinsfarms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multigamers-net.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multischool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "murmansk.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "musicradio.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mutualmoney.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "my-bratsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "my-tunisia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myarcade.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mychamberlain.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mychamberlain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mychamberlain.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mychemromance.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mygreatwebsite.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mykursumlija.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myliftmaster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myliftmaster.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mylight.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mylkguys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mymerlin.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mymerlin.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mypenza.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mypfp.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mypvhc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myqbusiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myraboats.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mystore24.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myxxxsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "n30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "na-kipre.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nabeez.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nabokov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nacocu.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nakedinkas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nameshield.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nameshield.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nancyzone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nandito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "napominanie.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "narrabeenlakesbikehire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naruto-best.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nataez.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "natasabekvalac.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naturalcosmetics.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naturelk.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nay.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nazarenoviso.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba-officecenter.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neboley.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neofilia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neoverso.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nert.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netrabota.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nevergirl.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "new-smile.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newillusion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newimage.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newlovers.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newlovers.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newlytricks.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "news-sy.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "news123.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "news12elite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "news53today.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "news54.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsbali.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsbusiness.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newscultural.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsinkansas.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsinpolitics.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsireland.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsuk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsvideo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newyorknews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nextpost.company", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicoleta-prestescu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nightwishchile.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niituva.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nika-travel.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nikitenko.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nikolahost.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nikolai-schmidt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nina-woerz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "no-real.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nocturnus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nokya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nontonfilem.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nopajam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "norala.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nordicsrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "northkoreainsider.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nou9ta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novak.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novanetwork.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novokuznetsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novoselie.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "now101atm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nullscripts.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "numericall.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nurmio.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "o30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "o365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "o3c.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oakparkmedicalcentre.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oaktravel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "obmen-viz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "obnalichka.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "occultisme.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "odysseytraining.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ogamerezine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oghost.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ogo-knigi.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oimexico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ok118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ok7779.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okpo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oldaine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oldbkcom.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oldcity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oldfieldmusic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oldiesmusicguide.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oldriver.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "olesaradio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "olivejs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ollo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "omretreats.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "one-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlineautodealered.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinecasinolisboa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onurerhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ooo-santal.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "operanavigation.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opncld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oposicionesprofesores.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orangtua.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orel-sait.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "organise.earth", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ortaev.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "otdyh-v-abhazii.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "otoplenie-ufa.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ouwerling.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oxymail.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ozonstyle.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p2d.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p58101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p58102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p58103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p58104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p58201.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p58202.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p58203.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p58204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p58205.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p888010.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9120.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9125.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9136.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9161.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9162.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9165.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9167.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9195.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9196.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p91aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p91ab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p91ac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p91ad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p91ae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p91af.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p91ag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p91ah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p91aj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p9cq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paintbrush.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pakistan24.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pamc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "panamatravel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "panangelium.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pandithaya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "panoramahurtowni.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "papakonstantinou.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paperplatefun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paramaquetas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paranoidandroid.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parfumer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkefficient.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parrocchiadimeana.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pasnederland.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pasteht.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pastorello.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "patioroof.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pattayafruitgarden.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paulandmadge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pavelitus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcbmarketing.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcisecuritystandards.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcissc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pdc.wales", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peacekeeper.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pearcom.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peliculasonline1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "penholder.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pensioner-1000.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pentamexicali.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "penza-on-line.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "penza-today.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "penzaonline.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perevedut.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perevirka.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perewall.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perpetual.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "personvernnemnda.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perulinks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pervoklass.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petrotrustlibya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petrozavodsk.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peturnashes.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pharmaceuticalcannabis.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "philarmonic-abaza.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "philippinenewsvanguard.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "philosophers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phuket-nash.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pierreterrien.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pigb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pilesyk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pinchuk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pionieren.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pipenav.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pivbar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pivotanimation.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pizzariapartiupizza.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21399.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21499.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21566.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21599.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21677.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21887.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21990.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21991.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21992.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21993.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21994.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21995.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21997.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pj21z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pjshop.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pkq5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "planeta-remontika.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "playingvideojuegos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pleasanton-daycare-childcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pleasantonmobilenotary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plenkanaotrez.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "poetenblog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "poker4all.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pokeram.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polimer39.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polisipati.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "politicsandnews.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "politicsnews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polliconstruction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polskienewsy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pomorskibereg.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "popova.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "postoyanstvo.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "potgrowersunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "potkani.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pozharnyi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pp234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pradeek.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "praiss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pravoslavie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pravoslavnayarus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pravosudie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "preference.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "premised.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "presidentdirectory.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prevention-formation.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pridnestrovye.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "progeste.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "programmatv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "projectfreehosting.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prostitutki-narvskaja.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prosto-dengi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "protek.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prototyping-computer.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psihotest.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psixotest.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psixotesty.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psw-training.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ptupapers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "public-measures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pucogid.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "purchasescooters.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "purrfectlove.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "putana.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "putanypitera.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "q30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "q365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "q88588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qdrat.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qq6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qqq6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qqq63.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qqq67.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quantumfinance.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qubhockey.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queirozmiotto.adv.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quiqstatus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "r30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raballder.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "racaliz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radioh.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radionrg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radiopharereims.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radiorainbow.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radmehrco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rainbowsmoothies.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rajaealhoceima.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ralix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rapport.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rascals.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ratgeber-guide.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "razgon.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "razvlekuha.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "razvlekuhablog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rdviitd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reallycooljobs.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "realpaella.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "recherchegruppe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redeyeguatemala.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redunion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "refluxogastroesofagico.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "regata2015.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "region-vologda.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rejido.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "remedee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reminisceaudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "remont-kvartirvmoskve.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "requena.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rescuer.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reshka.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "retailing.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reut42.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "revisoronline.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "revizor-online.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rezka-burenie.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rgpdkit.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "riba-lov.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "riddickthemovie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rido.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ridvan-vllasaliu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roadtripusa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roamfreun.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "robertoullan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "robuxemporium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rockslideengineering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rodinka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rolandozarate.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roofer.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roomee.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rosa-spain.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rosbiznes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rosstroj-balashiha.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rotaractclubtucuman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rothbruederlein.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roxburytech.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rssfeedonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rubbaduckee.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruchka-mashinka.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruexpert.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rufartabs.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruffnecks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruknguk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rumenka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "runame.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruoskachile.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rusexmany.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rushmyessay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "russian-page.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rust.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruthiehallarsis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ryabinushka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "s30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sabians.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sacians.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sadoun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "safefreehost.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "safesoundcounselingllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sainshand.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saint-peterburg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saint-petersburg.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saint-petersburg.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saint-petersburg.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saintip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saintpetersburg.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saintpetersburg.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saintpetersburg.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "salesactivities.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "salvadorinfantil.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sambuchanan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samiratv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samvui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sandwichcouncil.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanfranciscopersonalinjuryattorney.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sangen.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanluisdequillota.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "santibanezdetera.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "santjoandevilassar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sapibatam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saratov24.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saratovlive.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saratovnews.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saratovtime.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sarhua.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sbgroup.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sc21.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scandinaviancorner.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scarinex.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schellebelle.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schoolroom.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schoolstats.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schwarzenberg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scooter-experts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scotthelmesucks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scoutsanbartolome.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scrapbookdecorations.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scriptomania.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scurtam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seabrooklocksmith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "second-life-partner-ichien.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "secretagentclub.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "secumailer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "secumailer.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "secumailer.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "selimcerkezi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "selo-cer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "senhorst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seo-obmen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seo-phpbb.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seo-piar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seoonline.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seoserfing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seoviziti50.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seozel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "septonol.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serverninja.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serviefectivo.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "setevik.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sevastopol.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shadowfight2.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shanhay.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sharik-msk.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaytan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shechipin.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sheffield-wednesday-fc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shelehov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shenderman.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shijij.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shirevirtual.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shiriforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shiva-temple.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shola.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shop-slivki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shopera.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shouldbetaught.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "showmethegadgets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "showslivki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shrapnel.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sidmax.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sikaranbrotherhood.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "silvertorrents.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sim-mobile.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simsimi.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sincronizateconlosmilagros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinluzvenezuela.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sion-colony.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sirandorung.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siscompbolivia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "site-ua.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "site.mu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sitekatalog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sitesdesign.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skaiman.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skante.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skateswagger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skirts.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sky-live.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slipknot-site.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartcover.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartleads.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartphone-blog.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smcasino.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smcasino.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smiblog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sms-pro.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snatch-note.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sngnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snowboardforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snsirius.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sochionline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "socialair.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sociedadsostenible.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "softbit.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sokak-sanati.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soldierangels.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solidsteel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solunci-loznica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "someserver.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "somosabc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "son-onlajn.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "son-tolkovatel.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sonodrom.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sosaka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sot-te.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soundtube.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spacewallpaperhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spaenny.tf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sparkl.fm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sparklesvt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sparklingessentials.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spartancoin.ooo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spiritous.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sporemasters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sports-sites.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spotzlight.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "springhow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sritalaska.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sritcities.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srithunters.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sritidaho.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sritspanish.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sritvermont.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "standartgost.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "starsandmanifolds.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stealthpressurewashers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stebenkov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stefchapman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sterlitamak.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stevemario.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stevemason.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stilsvadba.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stonetribute.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stoplossoff.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "storefront.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "strikers.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stroiproect.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "studio-abok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stupidthoughts.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stupino-stroy.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stylebeat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "subdivider.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "successemails.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sucessclick.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sudanindependent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sudanindependent.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suecaunitedfc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sugatime.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sugos.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suicide.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sumatrabarat.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sumatrautara.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sumatriptan365.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "summarized.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sunshilin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sunshinelife.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suomenkielisetnettikasinot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superbestpalsclub.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superdrillers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "supermagna.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superservers.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superstargossip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superstarhost.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "supertrade.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "surnganet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "surveer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suseki.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swissurf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sy635.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t8803.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t8805.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t8807.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t8809.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t8815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t8816.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t8817.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t8819.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t8830.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88uu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88vip0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88vip1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88vip6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88vip7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t88yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taanishsaifu.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tabacundo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tablerocksbestrealtors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tadalafilindia.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taggigkaktus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taigamehack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tambov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tamoxifen-citrate.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarotistasvidentes.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tatary.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tattoo-art.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tauriscia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taxce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teamrevolution.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teazer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "technowise.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techserve.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techwalker.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teka.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telephoni-cdma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tempdomain.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "templete.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "temporarysanity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "terengganudaily.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "termoidraulico.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "test-school.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "testthis.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "textpages.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo0000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo0088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo1111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo2222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo3333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo4444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo5555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo6688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo7777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo7788.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo8899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgo9988.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgoaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgoall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgoasia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thaiboystory.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thaihotmodels.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thaiportal.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "the51news.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theandroidsoul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thebacteriafight.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thebestlaos.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thecarpenters.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theknockout.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theminiacs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thenest.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theparoxetine.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theproject.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thetopmovie.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thewashingmachine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thomastestor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thomsons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "threepercentrealty.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thuongtravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiagosimao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tierarzt-karlsruhe-durlach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tigerfm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tigergroup.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tihvin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiles-for-facing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "time-business.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "time-hotel.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timerace.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timgame.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timich.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timmi6790.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tips4india.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tirteafuera.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "titanforged.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tixio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tobiasfischer.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tolerance-zero.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tomsk.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tonorosario.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "top-russian.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "top10media.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topknot.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topspin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topurls.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tormox.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "torontonews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "torrance.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "totalhost.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "touchka.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tourism-exegetai.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toursinvietnam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toyschina.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toysplace.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tracking-app.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tradebotcompany.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "traderinside.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trafic-wap.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trapkitchen.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travelphilippines.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travelwithsearats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trazodononline.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "treatmentforkennelcough.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trials.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tribalwarsstyles.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tribistovo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tricountyathome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tridentmedia.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trilogyforce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "triplicate.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "troop89medfield.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trotter.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trusthook.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tryingtotakeovertheworld.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt0766.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt0866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt0966.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt2866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt2966.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt3666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt3699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt3766.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt3999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt7199.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt7299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt7399.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt8166.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt8266.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt8366.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tt9799.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tula-city.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tula-news.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuneotune.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tunisiapress.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turbosuflantecluj.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turciya.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turkey-portal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turkishhackers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turkmannews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turtlehead.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tutdevki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tutorialcoding.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tvoia-dietka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twainhartehotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twodrinksaway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty513.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty525.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty529.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty561.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty562.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty573.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty583.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty587.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty593.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty613.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty632.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty650.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty679.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty705.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty715.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty716.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty723.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty739.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty750.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty756.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty767.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty783.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty785.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty791.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty793.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty835.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty853.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty857.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty927.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty935.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty937.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty953.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty962.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty965.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ty980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tyumen.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tyva.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tyva.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "u30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uareferat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uberhorny.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uborka-kvartir-moskva.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ucmatedeveloper.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "udbina.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "udien.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ulsters.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultimate-fireworks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultimatebabyshowergifts.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultrafine.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unasim.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unbolt.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unboxed.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "undertow.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unexpectedcompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unitir.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uniuni.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "universidadcatolica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unixhost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unxcoconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uplinkgame.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uppfinnarenc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ural-emal.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urlfly.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "usercompare.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "utahrealestatepodcast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "utbosbeekhuuske.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "utevai.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uu378.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uzbekkizlari.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uzbektumblers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uzhas-uzhasny.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v05666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v1.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v10006.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v10008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v1951.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v3025.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v33v33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v44v44.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v5075.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v55510.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v55520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v55530.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v55565.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v55569.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v55580.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v55590.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v55593.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v55v55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v6021.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v6170.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v6350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v6506.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v66233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v66255.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v66557.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v66615.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v66618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v66619.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v66629.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v66635.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v66638.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v6752.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v6791.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v700a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v700b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v700w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v76555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v88299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v88511.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v88559.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v88656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v88799.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v9285.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v9286.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v9289.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v9812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v9820.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v9821.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v9823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v9831.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vacati0n.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valencianisme.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valeravi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vardenafilhcl.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "varianto25.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "varjo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vasheradio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vatav.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vbm11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vbm22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vbm33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vegetarier-sind-moerder.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veggies.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vektlofting.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "velib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vendi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "venezianischemasken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vengriya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veredadelaestrella.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verstka.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vestlundbolargen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veusveus.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "victorcarrasco.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "victorhorta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vidassemfronteiras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vietnam-tours.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vildlaithailand.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "villablino.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vinit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vip-moda.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vipcp.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visionxcreative.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visit-thailand.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visiter-tunis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visual-design.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vitaliyshepotkov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vkarpaty.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vladimir.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vlcentre.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vmf365.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vneftekamske.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns168.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns377a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns377b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns377c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns377d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns377e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns377f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns377g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns377h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns377i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns377j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns5151.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns5353.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns5656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns5757.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns5858.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns5959.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns6161.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns6262.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns6363.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns6565.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns6767.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns68611.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns68655.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns68669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns6868.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns6868.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns68722.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vns6969.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vnsr112233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voetbalclubinfo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "volosnet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vovkamagazine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vremyachko.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vrostove.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs106.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs107.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs1177.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs1717.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs2277.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs2828.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs313.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs5050.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs5151.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs601.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs603.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs6060.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs6161.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs680.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs7711.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs8899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs9911.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs9977.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vsaratove.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vsem-privet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vstavropole.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vulcancycling.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vulgar-teens.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vysokoe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w000999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w123123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w234234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w456456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w567567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w66w66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w678678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w789789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w888022.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w888033.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w888044.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w888066.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w888077.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w888088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w888099.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w9710.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w9720.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w9730.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w9740.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w9750.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w97a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w97aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w97app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w97app2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w97app3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w97bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w97cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waermekabine.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waimanu.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wajs1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wajs2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangshengze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wapbet365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wapnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wash-house.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "water-polo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wealthcreationsolutions.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "web-format.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "web-test.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webdesignersinchennai.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webinator.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weblights.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webmaster16.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webranking.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "websitedesignersmalappuram.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "websitedesignprice.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "websitepromotion.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wellnesshotel-weimar.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "west-raptors.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whisperwashonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whiterabbit.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wicontractortraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wien52.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wikisorg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wildandwonderfulbodycare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wildberries.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wilgo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wing-tsun.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wither.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wizardschool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wkhs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wns68123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wns6852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wns6862.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wns68622.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wns6865.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wns68666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wns6872.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wnsr3970.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wolflambert.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wonderlab.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "woorocket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wordops.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wordpresssetup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "worldcarding.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "worldoflegion.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wulfrun-invicta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ww6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x10006.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x2816.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3515.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3802.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3803.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3804.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3805.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3807.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3816.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3828.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x3927.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x58z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x5901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x5902.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x5903.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x5904.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x5905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x5906.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x5907.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x5908.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x5910.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x7008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x7713.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x7715.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x7716.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x7718.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x7719.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x7782.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x7785.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x7795.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x77ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x8100000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x8111111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x8122222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x8133333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x8144444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x8155555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x8166666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x8177777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x8188888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x8199999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81uu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x81zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x9015.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x9701.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x98z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x993.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab199.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab678a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab678b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab678c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab678d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab799.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xab899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xaba.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xacker.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xarangallomangallo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xenical.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xerdeso.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7ggg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xloud.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xmyy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--4brt03c.xn--io0a7i", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--7or43h.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--bcher-bestseller-jzb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--bcherbestseller-zvb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--eebao6b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--schcke-yxa.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj000444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj000555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj000666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj567088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj567288.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj567388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj567888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj678678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpjai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpjbeting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpjcs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xucha.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xx6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09app.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y09x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y3650.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y36500.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y3651.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y36511.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y3653.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y3654.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y3656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y36577.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y6180.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68ah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68am.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68bj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68cd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68cq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68fj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68gd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68gl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68gs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68gx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68gz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68heb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68hf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68hk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68hlj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68hn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68hz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68jl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68jn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68jx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68ln.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68nj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68nm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68nx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68qh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68sc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68sd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68sh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68sjz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68sx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68sy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68sz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68tj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68tw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68xg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68xj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68xz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68yn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y68zj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y70101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y70102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y70103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y70104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y70105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y7091.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y7092.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y7093.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y890000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y891111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y892222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y893333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y894444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y895555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y896666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y897777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y898888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89ggg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "y89zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yagoda-malina.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yangfamily.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yantox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan365.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan44.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan77.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapan999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapanwang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaws.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yellowsquid.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yemenlink.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yenbainet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yeniexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yepmom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yerbasbuenas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yesteryear-chronicle.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yiluup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yoloyolo.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yordanisp.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youcanhelp.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youla.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youngmodelsagency.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "your-forum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "your-greece.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youreward.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourmagicstory.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuandan.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yukoslibrary.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yy153.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yy393.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yy6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zackiarfan.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zadrot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zagruz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zaija.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zaim15min.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zajm-ehkspress.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zajmy-contact.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zajmy-contact.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zajmy-contact.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zajmy-contact.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zala.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zambianewsforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zamenim.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zandra.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zappingarahal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zapreaders.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zaruhi.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zcrypto.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd8883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zegriesalmansa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zemlyaki.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zen-zone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zepter.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zepter.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zero-knigi.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhivoj-dom.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zinabnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zindan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ziroux.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zizibook.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zl8585.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zl8873.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zloybot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "znanje.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "znich.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoepolitics.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zok-ambicija.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoko.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zonaperu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zowe.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zsoltbereczki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zumberak.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zverskij-site.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zzzz365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     // END OF 1-YEAR BULK HSTS ENTRIES
 
     // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/log/net_log.cc b/net/log/net_log.cc
index 040173eb..9fbe4e6 100644
--- a/net/log/net_log.cc
+++ b/net/log/net_log.cc
@@ -76,16 +76,6 @@
   UpdateObserverCaptureModes();
 }
 
-void NetLog::SetObserverCaptureMode(NetLog::ThreadSafeObserver* observer,
-                                    NetLogCaptureMode capture_mode) {
-  base::AutoLock lock(lock_);
-
-  DCHECK(HasObserver(observer));
-  DCHECK_EQ(this, observer->net_log_);
-  observer->capture_mode_ = capture_mode;
-  UpdateObserverCaptureModes();
-}
-
 void NetLog::RemoveObserver(NetLog::ThreadSafeObserver* observer) {
   base::AutoLock lock(lock_);
 
diff --git a/net/log/net_log.h b/net/log/net_log.h
index 6c2c9d21..dd04c0ec 100644
--- a/net/log/net_log.h
+++ b/net/log/net_log.h
@@ -245,13 +245,6 @@
   void AddObserver(ThreadSafeObserver* observer,
                    NetLogCaptureMode capture_mode);
 
-  // Sets the log capture mode of |observer| to |capture_mode|.  |observer| must
-  // be watching |this|.
-  // TODO(eroman): Remove the capability to dynamically change observer's
-  //               capture mode.
-  void SetObserverCaptureMode(ThreadSafeObserver* observer,
-                              NetLogCaptureMode capture_mode);
-
   // Removes an observer.
   //
   // For thread safety reasons, it is recommended that this not be called in
diff --git a/net/log/net_log_unittest.cc b/net/log/net_log_unittest.cc
index 8e009c8..38b2fe8 100644
--- a/net/log/net_log_unittest.cc
+++ b/net/log/net_log_unittest.cc
@@ -65,7 +65,7 @@
   TestNetLog net_log;
 
   for (NetLogCaptureMode mode : kModes) {
-    net_log.SetCaptureMode(mode);
+    net_log.SetObserverCaptureMode(mode);
     EXPECT_EQ(mode, net_log.GetObserver()->capture_mode());
 
     net_log.AddGlobalEntry(NetLogEventType::SOCKET_ALIVE,
@@ -208,11 +208,6 @@
       ASSERT_EQ(net_log_, observer_.net_log());
       ASSERT_EQ(NetLogCaptureMode::kIncludeSensitive, observer_.capture_mode());
 
-      net_log_->SetObserverCaptureMode(&observer_,
-                                       NetLogCaptureMode::kEverything);
-      ASSERT_EQ(net_log_, observer_.net_log());
-      ASSERT_EQ(NetLogCaptureMode::kEverything, observer_.capture_mode());
-
       net_log_->RemoveObserver(&observer_);
       ASSERT_TRUE(!observer_.net_log());
     }
@@ -284,12 +279,6 @@
   AddEvent(&net_log);
   EXPECT_EQ(1, observer.count());
 
-  // Change the observer's logging level and add an event.
-  net_log.SetObserverCaptureMode(&observer, NetLogCaptureMode::kEverything);
-  EXPECT_EQ(&net_log, observer.net_log());
-  EXPECT_EQ(NetLogCaptureMode::kEverything, observer.capture_mode());
-  EXPECT_TRUE(net_log.IsCapturing());
-
   AddEvent(&net_log);
   EXPECT_EQ(2, observer.count());
 
@@ -301,7 +290,8 @@
   AddEvent(&net_log);
   EXPECT_EQ(2, observer.count());
 
-  // Add the observer a final time, and add an event.
+  // Add the observer a final time, this time with a different capture mdoe, and
+  // add an event.
   net_log.AddObserver(&observer, NetLogCaptureMode::kEverything);
   EXPECT_EQ(&net_log, observer.net_log());
   EXPECT_EQ(NetLogCaptureMode::kEverything, observer.capture_mode());
diff --git a/net/log/test_net_log.cc b/net/log/test_net_log.cc
index adf29b94..3c345dc 100644
--- a/net/log/test_net_log.cc
+++ b/net/log/test_net_log.cc
@@ -14,96 +14,60 @@
 
 namespace net {
 
-// TestNetLog::Observer is an implementation of NetLog::ThreadSafeObserver
-// that saves messages to a buffer.
-class TestNetLog::Observer : public NetLog::ThreadSafeObserver {
- public:
-  Observer() = default;
-  ~Observer() override = default;
-
-  // Returns the list of all entries in the log.
-  void GetEntries(TestNetLogEntry::List* entry_list) const {
-    base::AutoLock lock(lock_);
-    *entry_list = entry_list_;
-  }
-
-  // Fills |entry_list| with all entries in the log from the specified Source.
-  void GetEntriesForSource(NetLogSource source,
-                           TestNetLogEntry::List* entry_list) const {
-    base::AutoLock lock(lock_);
-    entry_list->clear();
-    for (const auto& entry : entry_list_) {
-      if (entry.source.id == source.id)
-        entry_list->push_back(entry);
-    }
-  }
-
-  // Returns the number of entries in the log.
-  size_t GetSize() const {
-    base::AutoLock lock(lock_);
-    return entry_list_.size();
-  }
-
-  void Clear() {
-    base::AutoLock lock(lock_);
-    entry_list_.clear();
-  }
-
- private:
-  // ThreadSafeObserver implementation:
-  void OnAddEntry(const NetLogEntry& entry) override {
-    // Using Dictionaries instead of Values makes checking values a little
-    // simpler.
-    std::unique_ptr<base::DictionaryValue> param_dict =
-        base::DictionaryValue::From(
-            base::Value::ToUniquePtrValue(entry.params.Clone()));
-
-    // Only need to acquire the lock when accessing class variables.
-    base::AutoLock lock(lock_);
-    entry_list_.push_back(TestNetLogEntry(entry.type, base::TimeTicks::Now(),
-                                          entry.source, entry.phase,
-                                          std::move(param_dict)));
-  }
-
-  // Needs to be "mutable" to use it in GetEntries().
-  mutable base::Lock lock_;
-
-  TestNetLogEntry::List entry_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(Observer);
-};
-
-TestNetLog::TestNetLog() : observer_(new Observer()) {
-  AddObserver(observer_.get(), NetLogCaptureMode::kIncludeSensitive);
+TestNetLog::TestNetLog() {
+  AddObserver(this, NetLogCaptureMode::kIncludeSensitive);
 }
 
 TestNetLog::~TestNetLog() {
-  RemoveObserver(observer_.get());
-}
-
-void TestNetLog::SetCaptureMode(NetLogCaptureMode capture_mode) {
-  SetObserverCaptureMode(observer_.get(), capture_mode);
+  RemoveObserver(this);
 }
 
 void TestNetLog::GetEntries(TestNetLogEntry::List* entry_list) const {
-  observer_->GetEntries(entry_list);
+  base::AutoLock lock(lock_);
+  *entry_list = entry_list_;
 }
 
 void TestNetLog::GetEntriesForSource(NetLogSource source,
                                      TestNetLogEntry::List* entry_list) const {
-  observer_->GetEntriesForSource(source, entry_list);
+  base::AutoLock lock(lock_);
+  entry_list->clear();
+  for (const auto& entry : entry_list_) {
+    if (entry.source.id == source.id)
+      entry_list->push_back(entry);
+  }
 }
 
 size_t TestNetLog::GetSize() const {
-  return observer_->GetSize();
+  base::AutoLock lock(lock_);
+  return entry_list_.size();
 }
 
 void TestNetLog::Clear() {
-  observer_->Clear();
+  base::AutoLock lock(lock_);
+  entry_list_.clear();
 }
 
-NetLog::ThreadSafeObserver* TestNetLog::GetObserver() const {
-  return observer_.get();
+void TestNetLog::OnAddEntry(const NetLogEntry& entry) {
+  // Using Dictionaries instead of Values makes checking values a little
+  // simpler.
+  std::unique_ptr<base::DictionaryValue> param_dict =
+      base::DictionaryValue::From(
+          base::Value::ToUniquePtrValue(entry.params.Clone()));
+
+  // Only need to acquire the lock when accessing class variables.
+  base::AutoLock lock(lock_);
+  entry_list_.push_back(TestNetLogEntry(entry.type, base::TimeTicks::Now(),
+                                        entry.source, entry.phase,
+                                        std::move(param_dict)));
+}
+
+NetLog::ThreadSafeObserver* TestNetLog::GetObserver() {
+  return this;
+}
+
+void TestNetLog::SetObserverCaptureMode(NetLogCaptureMode capture_mode) {
+  RemoveObserver(this);
+  AddObserver(this, capture_mode);
 }
 
 BoundTestNetLog::BoundTestNetLog()
@@ -130,8 +94,8 @@
   test_net_log_.Clear();
 }
 
-void BoundTestNetLog::SetCaptureMode(NetLogCaptureMode capture_mode) {
-  test_net_log_.SetCaptureMode(capture_mode);
+void BoundTestNetLog::SetObserverCaptureMode(NetLogCaptureMode capture_mode) {
+  test_net_log_.SetObserverCaptureMode(capture_mode);
 }
 
 }  // namespace net
diff --git a/net/log/test_net_log.h b/net/log/test_net_log.h
index d13c34dc0..68ae88a 100644
--- a/net/log/test_net_log.h
+++ b/net/log/test_net_log.h
@@ -20,33 +20,42 @@
 
 struct NetLogSource;
 
-// TestNetLog is NetLog subclass which records all NetLog events that occur and
-// their parameters.  It is intended for testing only, and is part of the
-// net_test_support project.
-class TestNetLog : public NetLog {
+// NetLog subclass that attaches a single observer (this) to record NetLog
+// events and their parameters into an in-memory buffer. The NetLog is observed
+// at kSensitive level by default, however can be changed with
+// SetObserverCaptureMode().
+//
+// This class is for testing only.
+class TestNetLog : public NetLog, public NetLog::ThreadSafeObserver {
  public:
   TestNetLog();
   ~TestNetLog() override;
 
-  void SetCaptureMode(NetLogCaptureMode capture_mode);
+  void SetObserverCaptureMode(NetLogCaptureMode capture_mode);
 
-  // Below methods are forwarded to test_net_log_observer_.
+  // ThreadSafeObserver implementation:
+  void OnAddEntry(const NetLogEntry& entry) override;
+
+  // Returns the list of all observed NetLog entries.
   void GetEntries(TestNetLogEntry::List* entry_list) const;
+
+  // Fills |entry_list| with all entries in the log from the specified Source.
   void GetEntriesForSource(NetLogSource source,
                            TestNetLogEntry::List* entry_list) const;
+
+  // Returns the number of entries in the log.
   size_t GetSize() const;
+
   void Clear();
 
-  // Returns a NetLog observer that will write entries to the TestNetLog's event
-  // store. For testing code that bypasses NetLogs and adds events directly to
+  // Returns the NetLog observer responsible for recording the NetLog event
+  // stream. For testing code that bypasses NetLogs and adds events directly to
   // an observer.
-  NetLog::ThreadSafeObserver* GetObserver() const;
+  NetLog::ThreadSafeObserver* GetObserver();
 
  private:
-  // The underlying observer class that does all the work.
-  class Observer;
-
-  std::unique_ptr<Observer> observer_;
+  mutable base::Lock lock_;
+  TestNetLogEntry::List entry_list_;
 
   DISALLOW_COPY_AND_ASSIGN(TestNetLog);
 };
@@ -76,8 +85,8 @@
 
   void Clear();
 
-  // Sets the capture mode of the underlying TestNetLog.
-  void SetCaptureMode(NetLogCaptureMode capture_mode);
+  // Sets the observer capture mode of the underlying TestNetLog.
+  void SetObserverCaptureMode(NetLogCaptureMode capture_mode);
 
  private:
   TestNetLog test_net_log_;
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
index e30e647..e8cc93be 100644
--- a/net/socket/ssl_client_socket_unittest.cc
+++ b/net/socket/ssl_client_socket_unittest.cc
@@ -2387,7 +2387,7 @@
 
   TestCompletionCallback callback;
   TestNetLog log;
-  log.SetCaptureMode(NetLogCaptureMode::kEverything);
+  log.SetObserverCaptureMode(NetLogCaptureMode::kEverything);
   std::unique_ptr<StreamSocket> transport(
       new TCPClientSocket(addr(), nullptr, &log, NetLogSource()));
   int rv = callback.GetResult(transport->Connect(callback.callback()));
diff --git a/net/socket/udp_socket_unittest.cc b/net/socket/udp_socket_unittest.cc
index b89b518b..fef88b2 100644
--- a/net/socket/udp_socket_unittest.cc
+++ b/net/socket/udp_socket_unittest.cc
@@ -651,8 +651,6 @@
   socket.Close();
 }
 
-#if !defined(OS_FUCHSIA)
-// TODO(https://crbug.com/900709): SO_REUSEPORT doesn't work on Fuchsia.
 #if defined(OS_IOS)
 // TODO(https://crbug.com/947115): failing on device on iOS 12.2.
 #define MAYBE_SharedMulticastAddress DISABLED_SharedMulticastAddress
@@ -711,7 +709,6 @@
   EXPECT_EQ(kMessage, RecvFromSocket(&socket2));
 #endif  // !defined(OS_CHROMEOS)
 }
-#endif  // !defined(OS_FUCHSIA)
 #endif  // !defined(OS_ANDROID)
 
 TEST_F(UDPSocketTest, MulticastOptions) {
diff --git a/net/ssl/ssl_platform_key_util.h b/net/ssl/ssl_platform_key_util.h
index eaf9ccc..02729fec 100644
--- a/net/ssl/ssl_platform_key_util.h
+++ b/net/ssl/ssl_platform_key_util.h
@@ -25,7 +25,8 @@
 // background thread to avoid problems with buggy smartcards. Its underlying
 // Thread is non-joinable and as such provides
 // TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN semantics.
-scoped_refptr<base::SingleThreadTaskRunner> GetSSLPlatformKeyTaskRunner();
+NET_EXPORT_PRIVATE scoped_refptr<base::SingleThreadTaskRunner>
+GetSSLPlatformKeyTaskRunner();
 
 // Returns the public key of |certificate| as an |EVP_PKEY| or nullptr on error.
 bssl::UniquePtr<EVP_PKEY> GetClientCertPublicKey(
diff --git a/net/ssl/test_ssl_private_key.h b/net/ssl/test_ssl_private_key.h
index 2fa6c1a..2201594 100644
--- a/net/ssl/test_ssl_private_key.h
+++ b/net/ssl/test_ssl_private_key.h
@@ -6,7 +6,6 @@
 #define NET_SSL_TEST_SSL_PRIVATE_KEY_H_
 
 #include "base/memory/ref_counted.h"
-#include "net/base/net_export.h"
 #include "third_party/boringssl/src/include/openssl/base.h"
 
 namespace crypto {
@@ -19,11 +18,11 @@
 
 // Returns a new SSLPrivateKey which uses |key| for signing operations or
 // nullptr on error.
-NET_EXPORT scoped_refptr<SSLPrivateKey> WrapOpenSSLPrivateKey(
+scoped_refptr<SSLPrivateKey> WrapOpenSSLPrivateKey(
     bssl::UniquePtr<EVP_PKEY> key);
-NET_EXPORT scoped_refptr<SSLPrivateKey> WrapRSAPrivateKey(
+scoped_refptr<SSLPrivateKey> WrapRSAPrivateKey(
     crypto::RSAPrivateKey* rsa_private_key);
-NET_EXPORT scoped_refptr<SSLPrivateKey> CreateFailSigningSSLPrivateKey();
+scoped_refptr<SSLPrivateKey> CreateFailSigningSSLPrivateKey();
 
 }  // namespace net
 
diff --git a/net/ssl/threaded_ssl_private_key.h b/net/ssl/threaded_ssl_private_key.h
index 21c0483..a769331 100644
--- a/net/ssl/threaded_ssl_private_key.h
+++ b/net/ssl/threaded_ssl_private_key.h
@@ -15,6 +15,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "net/base/net_export.h"
 #include "net/ssl/ssl_private_key.h"
 
 namespace base {
@@ -25,7 +26,7 @@
 
 // An SSLPrivateKey implementation which offloads key operations to a background
 // task runner.
-class ThreadedSSLPrivateKey : public SSLPrivateKey {
+class NET_EXPORT ThreadedSSLPrivateKey : public SSLPrivateKey {
  public:
   // Interface for consumers to implement to perform the actual signing
   // operation.
diff --git a/net/url_request/redirect_info.h b/net/url_request/redirect_info.h
index 524adf95..0984bd0 100644
--- a/net/url_request/redirect_info.h
+++ b/net/url_request/redirect_info.h
@@ -63,6 +63,8 @@
   // The new first-party URL for cookies.
   GURL new_site_for_cookies;
 
+  // DEPRECATED TODO: Remove this as it was introduced for the cache key and can
+  // be removed now that |network_isolation_key| is set for the redirect cases.
   base::Optional<url::Origin> new_top_frame_origin;
 
   // The new HTTP referrer header.
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index ab88571..dee56a4 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -323,12 +323,6 @@
   request_info_.method = request_->method();
 
   request_info_.network_isolation_key = request_->network_isolation_key();
-  // TODO(crbug.com/963476): Remove this when network_isolation_key is being set
-  // in request_ for most cases.
-  if (!request_info_.network_isolation_key.IsFullyPopulated()) {
-    request_info_.network_isolation_key =
-        NetworkIsolationKey(request_->top_frame_origin());
-  }
 
   request_info_.load_flags = request_->load_flags();
   request_info_.traffic_annotation =
diff --git a/pdf/draw_utils/coordinates.cc b/pdf/draw_utils/coordinates.cc
index d3ed045..e7d6138 100644
--- a/pdf/draw_utils/coordinates.cc
+++ b/pdf/draw_utils/coordinates.cc
@@ -12,6 +12,11 @@
 namespace chrome_pdf {
 namespace draw_utils {
 
+void ExpandDocumentSize(const pp::Size& rect_size, pp::Size* doc_size) {
+  int width_diff = std::max(0, rect_size.width() - doc_size->width());
+  doc_size->Enlarge(width_diff, rect_size.height());
+}
+
 pp::Rect GetScreenRect(const pp::Rect& rect,
                        const pp::Point& position,
                        double zoom) {
@@ -24,5 +29,27 @@
   return pp::Rect(x, y, right - x, bottom - y);
 }
 
+pp::Rect GetLeftRectForTwoUpView(const pp::Size& rect_size,
+                                 const pp::Point& position,
+                                 const PageInsetSizes& page_insets) {
+  DCHECK_LE(rect_size.width(), position.x());
+
+  pp::Rect left_rect(position.x() - rect_size.width(), position.y(),
+                     rect_size.width(), rect_size.height());
+  left_rect.Inset(page_insets.left, page_insets.top, page_insets.right,
+                  page_insets.bottom);
+  return left_rect;
+}
+
+pp::Rect GetRightRectForTwoUpView(const pp::Size& rect_size,
+                                  const pp::Point& position,
+                                  const PageInsetSizes& page_insets) {
+  pp::Rect right_rect(position.x(), position.y(), rect_size.width(),
+                      rect_size.height());
+  right_rect.Inset(page_insets.left, page_insets.top, page_insets.right,
+                   page_insets.bottom);
+  return right_rect;
+}
+
 }  // namespace draw_utils
 }  // namespace chrome_pdf
diff --git a/pdf/draw_utils/coordinates.h b/pdf/draw_utils/coordinates.h
index a11424f..0e2586d 100644
--- a/pdf/draw_utils/coordinates.h
+++ b/pdf/draw_utils/coordinates.h
@@ -14,6 +14,21 @@
 namespace chrome_pdf {
 namespace draw_utils {
 
+// Struct for sending the sizes of the insets applied to the page to accommodate
+// for shadows/separators. I.e. the left component corresponds to the amount a
+// page was inset on the left side.
+struct PageInsetSizes {
+  int left;
+  int right;
+  int top;
+  int bottom;
+};
+
+// Given |rect_size|, sets the width of |doc_size| to the max of |rect_size|'s
+// width and |doc_size|'s width. Also adds the height of |rect_size| to
+// |doc_size|'s height.
+void ExpandDocumentSize(const pp::Size& rect_size, pp::Size* doc_size);
+
 // Given |rect| in document coordinates, a |position| in screen coordinates, and
 // a |zoom| factor, returns the rectangle in screen coordinates (i.e. 0,0 is top
 // left corner of plugin area).
@@ -23,6 +38,22 @@
                        const pp::Point& position,
                        double zoom);
 
+// Given |rect_size|, create a pp::Rect where the top-right corner lies at
+// |position|, and then inset it with the corresponding values of |page_insets|,
+// i.e. inset on left side with |page_insets.left|.
+// The width of |rect_size| must be less than or equal to the x value for
+// |position|.
+pp::Rect GetLeftRectForTwoUpView(const pp::Size& rect_size,
+                                 const pp::Point& position,
+                                 const PageInsetSizes& page_insets);
+
+// Given |rect_size|, create a pp::Rect where the top-left corner lies at
+// |position|, and then inset it with the corresponding values of |page_insets|,
+// i.e. inset on left side with |page_insets.left|.
+pp::Rect GetRightRectForTwoUpView(const pp::Size& rect_size,
+                                  const pp::Point& position,
+                                  const PageInsetSizes& page_insets);
+
 }  // namespace draw_utils
 }  // namespace chrome_pdf
 
diff --git a/pdf/draw_utils/coordinates_unittest.cc b/pdf/draw_utils/coordinates_unittest.cc
index af4424a5..897e40e 100644
--- a/pdf/draw_utils/coordinates_unittest.cc
+++ b/pdf/draw_utils/coordinates_unittest.cc
@@ -10,6 +10,38 @@
 namespace chrome_pdf {
 namespace draw_utils {
 
+namespace {
+
+constexpr PageInsetSizes kLeftInsets{5, 1, 3, 7};
+constexpr PageInsetSizes kRightInsets{1, 5, 3, 7};
+
+}  // namespace
+
+TEST(CoordinateTest, ExpandDocumentSize) {
+  pp::Size doc_size(100, 400);
+
+  // Test various expansion sizes.
+  pp::Size rect_size(100, 200);
+  ExpandDocumentSize(rect_size, &doc_size);
+  EXPECT_EQ(100, doc_size.width());
+  EXPECT_EQ(600, doc_size.height());
+
+  rect_size.SetSize(200, 150);
+  ExpandDocumentSize(rect_size, &doc_size);
+  EXPECT_EQ(200, doc_size.width());
+  EXPECT_EQ(750, doc_size.height());
+
+  rect_size.SetSize(100, 300);
+  ExpandDocumentSize(rect_size, &doc_size);
+  EXPECT_EQ(200, doc_size.width());
+  EXPECT_EQ(1050, doc_size.height());
+
+  rect_size.SetSize(250, 400);
+  ExpandDocumentSize(rect_size, &doc_size);
+  EXPECT_EQ(250, doc_size.width());
+  EXPECT_EQ(1450, doc_size.height());
+}
+
 TEST(CoordinateTest, GetScreenRect) {
   pp::Rect screen_rect;
   const pp::Rect rect(10, 20, 200, 300);
@@ -92,5 +124,124 @@
   EXPECT_EQ(0, screen_rect.height());
 }
 
+TEST(CoordinateTest, GetLeftRectForTwoUpView) {
+  pp::Rect left_rect;
+
+  left_rect = GetLeftRectForTwoUpView({200, 400}, {300, 100}, kLeftInsets);
+  EXPECT_EQ(105, left_rect.x());
+  EXPECT_EQ(103, left_rect.y());
+  EXPECT_EQ(194, left_rect.width());
+  EXPECT_EQ(390, left_rect.height());
+
+  left_rect = GetLeftRectForTwoUpView({300, 400}, {300, 0}, kLeftInsets);
+  EXPECT_EQ(5, left_rect.x());
+  EXPECT_EQ(3, left_rect.y());
+  EXPECT_EQ(294, left_rect.width());
+  EXPECT_EQ(390, left_rect.height());
+
+  // Test rect smaller than shadow insets returns empty rect.
+  left_rect = GetLeftRectForTwoUpView({5, 5}, {10, 0}, kLeftInsets);
+  EXPECT_EQ(10, left_rect.x());
+  EXPECT_EQ(3, left_rect.y());
+  EXPECT_EQ(0, left_rect.width());
+  EXPECT_EQ(0, left_rect.height());
+
+  // Test empty rect gets positioned.
+  left_rect = GetLeftRectForTwoUpView({0, 0}, {100, 0}, kLeftInsets);
+  EXPECT_EQ(105, left_rect.x());
+  EXPECT_EQ(3, left_rect.y());
+  EXPECT_EQ(0, left_rect.width());
+  EXPECT_EQ(0, left_rect.height());
+}
+
+TEST(CoordinateTest, GetRightRectForTwoUpView) {
+  pp::Rect right_rect;
+
+  right_rect = GetRightRectForTwoUpView({200, 400}, {300, 100}, kRightInsets);
+  EXPECT_EQ(301, right_rect.x());
+  EXPECT_EQ(103, right_rect.y());
+  EXPECT_EQ(194, right_rect.width());
+  EXPECT_EQ(390, right_rect.height());
+
+  right_rect = GetRightRectForTwoUpView({300, 400}, {300, 0}, kRightInsets);
+  EXPECT_EQ(301, right_rect.x());
+  EXPECT_EQ(3, right_rect.y());
+  EXPECT_EQ(294, right_rect.width());
+  EXPECT_EQ(390, right_rect.height());
+
+  // Test rect smaller than shadow insets returns empty rect.
+  right_rect = GetRightRectForTwoUpView({5, 5}, {10, 0}, kRightInsets);
+  EXPECT_EQ(11, right_rect.x());
+  EXPECT_EQ(3, right_rect.y());
+  EXPECT_EQ(0, right_rect.width());
+  EXPECT_EQ(0, right_rect.height());
+
+  // Test empty rect gets positioned.
+  right_rect = GetRightRectForTwoUpView({0, 0}, {100, 0}, kRightInsets);
+  EXPECT_EQ(101, right_rect.x());
+  EXPECT_EQ(3, right_rect.y());
+  EXPECT_EQ(0, right_rect.width());
+  EXPECT_EQ(0, right_rect.height());
+}
+
+TEST(CoordinateTest, TwoUpViewLayout) {
+  pp::Rect left_rect;
+  pp::Rect right_rect;
+  pp::Point position(1066, 0);
+
+  // Test layout when the widest page is on the left.
+  left_rect = GetLeftRectForTwoUpView({826, 1066}, position, kLeftInsets);
+  EXPECT_EQ(245, left_rect.x());
+  EXPECT_EQ(3, left_rect.y());
+  EXPECT_EQ(820, left_rect.width());
+  EXPECT_EQ(1056, left_rect.height());
+
+  right_rect = GetRightRectForTwoUpView({1066, 826}, position, kRightInsets);
+  EXPECT_EQ(1067, right_rect.x());
+  EXPECT_EQ(3, right_rect.y());
+  EXPECT_EQ(1060, right_rect.width());
+  EXPECT_EQ(816, right_rect.height());
+
+  position.set_y(1066);
+  left_rect = GetLeftRectForTwoUpView({826, 1066}, position, kLeftInsets);
+  EXPECT_EQ(245, left_rect.x());
+  EXPECT_EQ(1069, left_rect.y());
+  EXPECT_EQ(820, left_rect.width());
+  EXPECT_EQ(1056, left_rect.height());
+
+  right_rect = GetRightRectForTwoUpView({826, 900}, position, kRightInsets);
+  EXPECT_EQ(1067, right_rect.x());
+  EXPECT_EQ(1069, right_rect.y());
+  EXPECT_EQ(820, right_rect.width());
+  EXPECT_EQ(890, right_rect.height());
+
+  // Test layout when the widest page is on the right.
+  position.set_y(0);
+  left_rect = GetLeftRectForTwoUpView({1066, 826}, position, kLeftInsets);
+  EXPECT_EQ(5, left_rect.x());
+  EXPECT_EQ(3, left_rect.y());
+  EXPECT_EQ(1060, left_rect.width());
+  EXPECT_EQ(816, left_rect.height());
+
+  right_rect = GetRightRectForTwoUpView({826, 1066}, position, kRightInsets);
+  EXPECT_EQ(1067, right_rect.x());
+  EXPECT_EQ(3, right_rect.y());
+  EXPECT_EQ(820, right_rect.width());
+  EXPECT_EQ(1056, right_rect.height());
+
+  position.set_y(1066);
+  left_rect = GetLeftRectForTwoUpView({826, 900}, position, kLeftInsets);
+  EXPECT_EQ(245, left_rect.x());
+  EXPECT_EQ(1069, left_rect.y());
+  EXPECT_EQ(820, left_rect.width());
+  EXPECT_EQ(890, left_rect.height());
+
+  right_rect = GetRightRectForTwoUpView({826, 1066}, position, kRightInsets);
+  EXPECT_EQ(1067, right_rect.x());
+  EXPECT_EQ(1069, right_rect.y());
+  EXPECT_EQ(820, right_rect.width());
+  EXPECT_EQ(1056, right_rect.height());
+}
+
 }  // namespace draw_utils
 }  // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index 4fbca922..3e01cdf 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -2639,10 +2639,7 @@
     pp::Rect rect(pp::Point(0, document_size_.height()), size);
     page_rects.push_back(rect);
 
-    if (size.width() > document_size_.width())
-      document_size_.set_width(size.width());
-
-    document_size_.Enlarge(0, size.height());
+    draw_utils::ExpandDocumentSize(size, &document_size_);
   }
 
   for (size_t i = 0; i < new_page_count; ++i) {
diff --git a/services/audio/loopback_stream.cc b/services/audio/loopback_stream.cc
index 2160fc3..c30ec22e 100644
--- a/services/audio/loopback_stream.cc
+++ b/services/audio/loopback_stream.cc
@@ -68,43 +68,32 @@
   observer_.set_disconnect_handler(
       base::BindOnce(&LoopbackStream::OnError, base::Unretained(this)));
 
-  // As of this writing, only machines older than about 10 years won't be able
-  // to produce high-resolution timestamps. In order to avoid adding extra
-  // complexity to the implementation, simply refuse to operate without that
-  // basic level of hardware support.
-  //
   // Construct the components of the AudioDataPipe, for delivering the data to
   // the consumer. If successful, create the FlowNetwork too.
-  if (base::TimeTicks::IsHighResolution()) {
-    base::CancelableSyncSocket foreign_socket;
-    std::unique_ptr<InputSyncWriter> writer = InputSyncWriter::Create(
-        base::BindRepeating(
-            [](const std::string& message) { VLOG(1) << message; }),
-        shared_memory_count, params, &foreign_socket);
-    if (writer) {
-      base::ReadOnlySharedMemoryRegion shared_memory_region =
-          writer->TakeSharedMemoryRegion();
-      mojo::ScopedHandle socket_handle;
-      if (shared_memory_region.IsValid()) {
-        socket_handle = mojo::WrapPlatformFile(foreign_socket.Release());
-        if (socket_handle.is_valid()) {
-          std::move(created_callback)
-              .Run({base::in_place, std::move(shared_memory_region),
-                    std::move(socket_handle)});
-          network_.reset(new FlowNetwork(std::move(flow_task_runner), params,
-                                         std::move(writer)));
-          return;  // Success!
-        }
+  base::CancelableSyncSocket foreign_socket;
+  std::unique_ptr<InputSyncWriter> writer = InputSyncWriter::Create(
+      base::BindRepeating(
+          [](const std::string& message) { VLOG(1) << message; }),
+      shared_memory_count, params, &foreign_socket);
+  if (writer) {
+    base::ReadOnlySharedMemoryRegion shared_memory_region =
+        writer->TakeSharedMemoryRegion();
+    mojo::ScopedHandle socket_handle;
+    if (shared_memory_region.IsValid()) {
+      socket_handle = mojo::WrapPlatformFile(foreign_socket.Release());
+      if (socket_handle.is_valid()) {
+        std::move(created_callback)
+            .Run({base::in_place, std::move(shared_memory_region),
+                  std::move(socket_handle)});
+        network_.reset(new FlowNetwork(std::move(flow_task_runner), params,
+                                       std::move(writer)));
+        return;  // Success!
       }
     }
-  } else /* if (!base::TimeTicks::IsHighResolution()) */ {
-    LOG(ERROR) << "Refusing to start loop-back because this machine cannot "
-                  "provide high-resolution timestamps.";
   }
 
-  // If this point is reached, either the TimeTicks clock is not high resolution
-  // or one or more AudioDataPipe components failed to initialize. Report the
-  // error.
+  // If this point is reached, one or more AudioDataPipe components failed to
+  // initialize. Report the error.
   std::move(created_callback).Run(nullptr);
   OnError();
 }
@@ -174,6 +163,17 @@
     return;
   }
 
+  if (!base::TimeTicks::IsHighResolution()) {
+    // As of this writing, only machines manufactured before 2008 won't be able
+    // to produce high-resolution timestamps. Since the buffer management logic
+    // (to mitigate overruns/underruns) depends on them to function correctly,
+    // simply return early (i.e., never start snooping on the |member|).
+    TRACE_EVENT_INSTANT0("audio",
+                         "LoopbackStream::OnMemberJoinedGroup Rejected",
+                         TRACE_EVENT_SCOPE_THREAD);
+    return;
+  }
+
   TRACE_EVENT1("audio", "LoopbackStream::OnMemberJoinedGroup", "member",
                member);
 
@@ -194,10 +194,14 @@
     return;
   }
 
+  const auto snoop_it = snoopers_.find(member);
+  if (snoop_it == snoopers_.end()) {
+    // See comments about "high-resolution timestamps" in OnMemberJoinedGroup().
+    return;
+  }
+
   TRACE_EVENT1("audio", "LoopbackStream::OnMemberLeftGroup", "member", member);
 
-  const auto snoop_it = snoopers_.find(member);
-  DCHECK(snoop_it != snoopers_.end());
   SnooperNode* const snooper = &(snoop_it->second);
   member->StopSnooping(snooper);
   network_->RemoveInput(snooper);
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
index c6c0fa3..43e5f5e 100644
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -81,6 +81,13 @@
 const base::Feature kCORBProtectionSniffing{"CORBProtectionSniffing",
                                             base::FEATURE_ENABLED_BY_DEFAULT};
 
+// When kProactivelyThrottleLowPriorityRequests is enabled,
+// resource scheduler proactively throttles low priority requests to avoid
+// network contention with high priority requests that may arrive soon.
+const base::Feature kProactivelyThrottleLowPriorityRequests{
+    "ProactivelyThrottleLowPriorityRequests",
+    base::FEATURE_DISABLED_BY_DEFAULT};
+
 bool ShouldEnableOutOfBlinkCors() {
   // OOR-CORS requires NetworkService.
   if (!base::FeatureList::IsEnabled(features::kNetworkService))
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
index 7e5f77d8..39108a4 100644
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -35,6 +35,8 @@
 extern const base::Feature kPauseBrowserInitiatedHeavyTrafficForP2P;
 COMPONENT_EXPORT(NETWORK_CPP)
 extern const base::Feature kCORBProtectionSniffing;
+COMPONENT_EXPORT(NETWORK_CPP)
+extern const base::Feature kProactivelyThrottleLowPriorityRequests;
 
 COMPONENT_EXPORT(NETWORK_CPP) bool ShouldEnableOutOfBlinkCors();
 
diff --git a/services/network/public/cpp/resource_request.cc b/services/network/public/cpp/resource_request.cc
index 738a7d0..4a38b79 100644
--- a/services/network/public/cpp/resource_request.cc
+++ b/services/network/public/cpp/resource_request.cc
@@ -16,6 +16,10 @@
   return method == request.method && url == request.url &&
          site_for_cookies == request.site_for_cookies &&
          top_frame_origin == request.top_frame_origin &&
+         trusted_network_isolation_key ==
+             request.trusted_network_isolation_key &&
+         update_network_isolation_key_on_redirect ==
+             request.update_network_isolation_key_on_redirect &&
          attach_same_site_cookies == request.attach_same_site_cookies &&
          update_first_party_url_on_redirect ==
              request.update_first_party_url_on_redirect &&
diff --git a/services/network/public/cpp/resource_request.h b/services/network/public/cpp/resource_request.h
index ffcdef9e2..5e4a713 100644
--- a/services/network/public/cpp/resource_request.h
+++ b/services/network/public/cpp/resource_request.h
@@ -12,6 +12,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
 #include "base/unguessable_token.h"
+#include "net/base/network_isolation_key.h"
 #include "net/base/request_priority.h"
 #include "net/http/http_request_headers.h"
 #include "net/url_request/url_request.h"
@@ -40,6 +41,10 @@
   GURL url;
   GURL site_for_cookies;
   base::Optional<url::Origin> top_frame_origin;
+  net::NetworkIsolationKey trusted_network_isolation_key;
+  mojom::UpdateNetworkIsolationKeyOnRedirect
+      update_network_isolation_key_on_redirect =
+          network::mojom::UpdateNetworkIsolationKeyOnRedirect::kDoNotUpdate;
   bool attach_same_site_cookies = false;
   bool update_first_party_url_on_redirect = false;
   base::Optional<url::Origin> request_initiator;
diff --git a/services/network/public/cpp/simple_url_loader_unittest.cc b/services/network/public/cpp/simple_url_loader_unittest.cc
index 0374341..64494c3b 100644
--- a/services/network/public/cpp/simple_url_loader_unittest.cc
+++ b/services/network/public/cpp/simple_url_loader_unittest.cc
@@ -1691,7 +1691,7 @@
   kClientPipeClosed,
   kBodyBufferClosed,
   // Advances time by 1 second. Only callable when the test environment is
-  // configured to be MainThreadType::MOCK_TIME.
+  // configured to be TimeSource::MOCK_TIME.
   kAdvanceOneSecond,
 };
 
@@ -2973,7 +2973,7 @@
 }
 
 // Don't inherit from SimpleURLLoaderTestBase so that we can initialize our
-// |scoped_task_environment_| different namely with MainThreadType::MOCK_TIME.
+// |scoped_task_environment_| different namely with TimeSource::MOCK_TIME.
 class SimpleURLLoaderMockTimeTest : public testing::Test {
  public:
   SimpleURLLoaderMockTimeTest()
diff --git a/services/network/public/cpp/url_request.typemap b/services/network/public/cpp/url_request.typemap
index 65a94f4..d0be46d 100644
--- a/services/network/public/cpp/url_request.typemap
+++ b/services/network/public/cpp/url_request.typemap
@@ -12,6 +12,7 @@
 traits_headers = [
   "//services/network/public/cpp/network_ipc_param_traits.h",
   "//services/network/public/cpp/url_request_mojom_traits.h",
+  "//services/network/public/cpp/network_isolation_key_mojom_traits.h",
 ]
 public_deps = [
   "//base",
diff --git a/services/network/public/cpp/url_request_mojom_traits.cc b/services/network/public/cpp/url_request_mojom_traits.cc
index b3d6138..27df040 100644
--- a/services/network/public/cpp/url_request_mojom_traits.cc
+++ b/services/network/public/cpp/url_request_mojom_traits.cc
@@ -157,6 +157,8 @@
   if (!data.ReadMethod(&out->method) || !data.ReadUrl(&out->url) ||
       !data.ReadSiteForCookies(&out->site_for_cookies) ||
       !data.ReadTopFrameOrigin(&out->top_frame_origin) ||
+      !data.ReadTrustedNetworkIsolationKey(
+          &out->trusted_network_isolation_key) ||
       !data.ReadRequestInitiator(&out->request_initiator) ||
       !data.ReadReferrer(&out->referrer) ||
       !data.ReadReferrerPolicy(&out->referrer_policy) ||
@@ -180,6 +182,8 @@
     return false;
   }
 
+  out->update_network_isolation_key_on_redirect =
+      data.update_network_isolation_key_on_redirect();
   out->attach_same_site_cookies = data.attach_same_site_cookies();
   out->update_first_party_url_on_redirect =
       data.update_first_party_url_on_redirect();
diff --git a/services/network/public/cpp/url_request_mojom_traits.h b/services/network/public/cpp/url_request_mojom_traits.h
index ab4d8fc..03688ba 100644
--- a/services/network/public/cpp/url_request_mojom_traits.h
+++ b/services/network/public/cpp/url_request_mojom_traits.h
@@ -17,6 +17,7 @@
 #include "mojo/public/cpp/bindings/struct_traits.h"
 #include "net/base/request_priority.h"
 #include "services/network/public/cpp/data_element.h"
+#include "services/network/public/cpp/network_isolation_key_mojom_traits.h"
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/cpp/resource_request_body.h"
 #include "services/network/public/mojom/chunked_data_pipe_getter.mojom.h"
@@ -59,6 +60,15 @@
       const network::ResourceRequest& request) {
     return request.top_frame_origin;
   }
+  static network::mojom::UpdateNetworkIsolationKeyOnRedirect
+  update_network_isolation_key_on_redirect(
+      const network::ResourceRequest& request) {
+    return request.update_network_isolation_key_on_redirect;
+  }
+  static const net::NetworkIsolationKey& trusted_network_isolation_key(
+      const network::ResourceRequest& request) {
+    return request.trusted_network_isolation_key;
+  }
   static bool attach_same_site_cookies(
       const network::ResourceRequest& request) {
     return request.attach_same_site_cookies;
diff --git a/services/network/public/cpp/url_request_mojom_traits_unittest.cc b/services/network/public/cpp/url_request_mojom_traits_unittest.cc
index 26a8a8f..ebbab850 100644
--- a/services/network/public/cpp/url_request_mojom_traits_unittest.cc
+++ b/services/network/public/cpp/url_request_mojom_traits_unittest.cc
@@ -49,6 +49,11 @@
   original.url = GURL("https://example.com/resources/dummy.xml");
   original.site_for_cookies = GURL("https://example.com/index.html");
   original.top_frame_origin = url::Origin::Create(original.url);
+  original.trusted_network_isolation_key =
+      net::NetworkIsolationKey(url::Origin::Create(original.url));
+  original.update_network_isolation_key_on_redirect =
+      network::mojom::UpdateNetworkIsolationKeyOnRedirect::
+          kUpdateTopFrameAndInitiatingFrameOrigin;
   original.attach_same_site_cookies = true;
   original.update_first_party_url_on_redirect = false;
   original.request_initiator = url::Origin::Create(original.url);
diff --git a/services/network/public/mojom/url_loader.mojom b/services/network/public/mojom/url_loader.mojom
index 9c5238d2d..fcf08a6 100644
--- a/services/network/public/mojom/url_loader.mojom
+++ b/services/network/public/mojom/url_loader.mojom
@@ -14,6 +14,7 @@
 import "services/network/public/mojom/data_pipe_getter.mojom";
 import "services/network/public/mojom/fetch_api.mojom";
 import "services/network/public/mojom/http_request_headers.mojom";
+import "services/network/public/mojom/network_isolation_key.mojom";
 import "services/network/public/mojom/network_param.mojom";
 import "url/mojom/origin.mojom";
 import "url/mojom/url.mojom";
@@ -70,6 +71,21 @@
   kBytes,
 };
 
+// Used to determine if URLRequest::trusted_network_isolation_key should be
+// updated on redirect.
+enum UpdateNetworkIsolationKeyOnRedirect {
+  kDoNotUpdate,
+
+  // The updated network isolation key will take the redirected url's origin as
+  // the top frame origin and initiating frame origin.
+  kUpdateTopFrameAndInitiatingFrameOrigin,
+
+  // The updated network isolation key will take existing
+  // |trusted_network_isolation_key|'s top frame origin and redirected url's
+  // origin as the initiating frame origin.
+  kUpdateInitiatingFrameOrigin
+};
+
 // Typemapped to network::ResourceRequest.
 struct URLRequest {
   // The request method: GET, POST, etc.
@@ -101,10 +117,22 @@
   //
   // Note that this is experimental.
   //
-  // TODO(crbug.com/911299): This field will most likely be removed at some
-  // point.
+  // TODO(crbug.com/911299, crbug.com/978968): This field will most likely be
+  // removed at some point.
   url.mojom.Origin? top_frame_origin;
 
+  // This resource request will be keyed using |trusted_network_isolation_key|
+  // for accessing shared network resources like the http cache. This must only
+  // be populated from a trusted process. Optional since it is not filled for
+  // all requests e.g. those coming from a less trusted process. This parameter
+  // may only be set if the URLLoaderFactory was not created with a pre-bound
+  // network isolation key, and it is an error to do otherwise.
+  NetworkIsolationKey? trusted_network_isolation_key;
+
+  // Whether or not the network isolation key needs to be recomputed on
+  // redirects. Typically this is only done for navigations.
+  UpdateNetworkIsolationKeyOnRedirect update_network_isolation_key_on_redirect;
+
   // Boolean indicating whether SameSite cookies are allowed to be attached
   // to the request. It should be used as additional input to network side
   // checks.
diff --git a/services/network/resource_scheduler_params_manager.cc b/services/network/resource_scheduler_params_manager.cc
index 15dc7de..db16883e 100644
--- a/services/network/resource_scheduler_params_manager.cc
+++ b/services/network/resource_scheduler_params_manager.cc
@@ -218,6 +218,38 @@
     }
   }
 
+  if (base::FeatureList::IsEnabled(
+          features::kProactivelyThrottleLowPriorityRequests)) {
+    for (net::EffectiveConnectionType effective_connection_type =
+             net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
+         effective_connection_type <= net::EFFECTIVE_CONNECTION_TYPE_4G;
+         effective_connection_type = static_cast<net::EffectiveConnectionType>(
+             effective_connection_type + 1)) {
+      std::string param_name = "http_rtt_multiplier_for_proactive_throttling_" +
+                               std::string(GetNameForEffectiveConnectionType(
+                                   effective_connection_type));
+
+      double http_rtt_multiplier = base::GetFieldTrialParamByFeatureAsDouble(
+          features::kProactivelyThrottleLowPriorityRequests, param_name, -1);
+
+      if (http_rtt_multiplier < 0)
+        continue;
+
+      ResourceSchedulerParamsManager::ParamsForNetworkQualityContainer::iterator
+          iter = result.find(effective_connection_type);
+
+      if (iter == result.end()) {
+        // Add a default ParamsForNetworkQuality object to |result|.
+        result.emplace(std::make_pair(
+            effective_connection_type,
+            ResourceSchedulerParamsManager::ParamsForNetworkQuality()));
+      }
+      iter = result.find(effective_connection_type);
+      iter->second.http_rtt_multiplier_for_proactive_throttling =
+          http_rtt_multiplier;
+    }
+  }
+
   return result;
 }
 
@@ -247,6 +279,10 @@
         const ResourceSchedulerParamsManager::ParamsForNetworkQuality& other) =
         default;
 
+ResourceSchedulerParamsManager::ParamsForNetworkQuality&
+ResourceSchedulerParamsManager::ParamsForNetworkQuality::operator=(
+    const ParamsForNetworkQuality& other) = default;
+
 ResourceSchedulerParamsManager::ResourceSchedulerParamsManager()
     : ResourceSchedulerParamsManager(GetParamsForNetworkQualityContainer()) {}
 
diff --git a/services/network/resource_scheduler_params_manager.h b/services/network/resource_scheduler_params_manager.h
index 99ec21b..71f9de9 100644
--- a/services/network/resource_scheduler_params_manager.h
+++ b/services/network/resource_scheduler_params_manager.h
@@ -35,6 +35,8 @@
 
     ParamsForNetworkQuality(const ParamsForNetworkQuality& other);
 
+    ParamsForNetworkQuality& operator=(const ParamsForNetworkQuality& other);
+
     // The maximum number of delayable requests allowed.
     size_t max_delayable_requests;
 
@@ -49,6 +51,13 @@
     // The maximum duration for which a request is queued after after which the
     // request is dispatched to the network.
     base::Optional<base::TimeDelta> max_queuing_time;
+
+    // If a non-delayable request is in-flight, then delayable requests are
+    // proactively throttled for duration =
+    // http_rtt_multiplier_for_proactive_throttling multiplied by current HTTP
+    // RTT estimate. The throttling duration is computed since the start of the
+    // most recent non-delayable request.
+    base::Optional<double> http_rtt_multiplier_for_proactive_throttling;
   };
 
   ResourceSchedulerParamsManager();
diff --git a/services/network/resource_scheduler_params_manager_unittest.cc b/services/network/resource_scheduler_params_manager_unittest.cc
index 146775c4..d32151b4 100644
--- a/services/network/resource_scheduler_params_manager_unittest.cc
+++ b/services/network/resource_scheduler_params_manager_unittest.cc
@@ -99,6 +99,10 @@
             resource_scheduler_params_manager
                 .GetParamsForEffectiveConnectionType(effective_connection_type)
                 .max_queuing_time.has_value());
+        EXPECT_FALSE(
+            resource_scheduler_params_manager
+                .GetParamsForEffectiveConnectionType(effective_connection_type)
+                .http_rtt_multiplier_for_proactive_throttling);
         return;
 
       case net::EFFECTIVE_CONNECTION_TYPE_3G:
@@ -118,6 +122,10 @@
             resource_scheduler_params_manager
                 .GetParamsForEffectiveConnectionType(effective_connection_type)
                 .max_queuing_time.has_value());
+        EXPECT_FALSE(
+            resource_scheduler_params_manager
+                .GetParamsForEffectiveConnectionType(effective_connection_type)
+                .http_rtt_multiplier_for_proactive_throttling);
         return;
 
       case net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G:
@@ -138,6 +146,10 @@
             resource_scheduler_params_manager
                 .GetParamsForEffectiveConnectionType(effective_connection_type)
                 .max_queuing_time.has_value());
+        EXPECT_FALSE(
+            resource_scheduler_params_manager
+                .GetParamsForEffectiveConnectionType(effective_connection_type)
+                .http_rtt_multiplier_for_proactive_throttling);
         return;
 
       case net::EFFECTIVE_CONNECTION_TYPE_LAST:
@@ -521,6 +533,46 @@
                       net::EFFECTIVE_CONNECTION_TYPE_4G);
 }
 
+TEST_F(ResourceSchedulerParamsManagerTest,
+       ProactivelyThrottleLowPriorityRequests) {
+  const double kDelaySlow2G = 1.5;
+  const double kDelay2G = 1.6;
+  const double kDelay4G = 0.5;
+
+  base::test::ScopedFeatureList scoped_feature_list;
+
+  base::FieldTrialParams params;
+  params["http_rtt_multiplier_for_proactive_throttling_Slow-2G"] =
+      base::NumberToString(kDelaySlow2G);
+  params["http_rtt_multiplier_for_proactive_throttling_2G"] =
+      base::NumberToString(kDelay2G);
+  params["http_rtt_multiplier_for_proactive_throttling_4G"] =
+      base::NumberToString(kDelay4G);
+
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      features::kProactivelyThrottleLowPriorityRequests, params);
+
+  ResourceSchedulerParamsManager resource_scheduler_params_manager;
+
+  EXPECT_EQ(kDelaySlow2G, resource_scheduler_params_manager
+                              .GetParamsForEffectiveConnectionType(
+                                  net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G)
+                              .http_rtt_multiplier_for_proactive_throttling);
+  EXPECT_EQ(kDelay2G, resource_scheduler_params_manager
+                          .GetParamsForEffectiveConnectionType(
+                              net::EFFECTIVE_CONNECTION_TYPE_2G)
+                          .http_rtt_multiplier_for_proactive_throttling);
+  EXPECT_FALSE(resource_scheduler_params_manager
+                   .GetParamsForEffectiveConnectionType(
+                       net::EFFECTIVE_CONNECTION_TYPE_3G)
+                   .http_rtt_multiplier_for_proactive_throttling.has_value());
+  EXPECT_EQ(kDelay4G,
+            resource_scheduler_params_manager
+                .GetParamsForEffectiveConnectionType(
+                    net::EFFECTIVE_CONNECTION_TYPE_4G)
+                .http_rtt_multiplier_for_proactive_throttling.value());
+}
+
 }  // unnamed namespace
 
 }  // namespace network
diff --git a/services/network/session_cleanup_cookie_store_unittest.cc b/services/network/session_cleanup_cookie_store_unittest.cc
index 24e3158..0d680bb0 100644
--- a/services/network/session_cleanup_cookie_store_unittest.cc
+++ b/services/network/session_cleanup_cookie_store_unittest.cc
@@ -167,7 +167,7 @@
   base::Time t = base::Time::Now();
   AddCookie("A", "B", "nonpersistent.com", "/", t);
 
-  net_log_.SetCaptureMode(net::NetLogCaptureMode::kDefault);
+  net_log_.SetObserverCaptureMode(net::NetLogCaptureMode::kDefault);
   // Cookies from "nonpersistent.com" should be deleted.
   store_->DeleteSessionCookies(
       base::BindRepeating([](const std::string& domain, bool is_https) {
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index 97b75021..442789b8e 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -374,14 +374,16 @@
       custom_proxy_post_cache_headers_(request.custom_proxy_post_cache_headers),
       custom_proxy_use_alternate_proxy_list_(
           request.custom_proxy_use_alternate_proxy_list),
-      fetch_window_id_(request.fetch_window_id) {
+      fetch_window_id_(request.fetch_window_id),
+      update_network_isolation_key_on_redirect_(
+          request.update_network_isolation_key_on_redirect) {
   DCHECK(delete_callback_);
   DCHECK(factory_params_);
   if (!base::FeatureList::IsEnabled(features::kNetworkService)) {
     CHECK(!url_loader_client_.internal_state()
-                    ->handle()
-                    .QuerySignalsState()
-                    .peer_remote())
+               ->handle()
+               .QuerySignalsState()
+               .peer_remote())
         << "URLLoader must not be used by the renderer when network service is "
         << "disabled, as that skips security checks in ResourceDispatcherHost. "
         << "The only acceptable usage is the browser using SimpleURLLoader.";
@@ -411,7 +413,15 @@
   url_request_->set_referrer_policy(request.referrer_policy);
   url_request_->set_upgrade_if_insecure(request.upgrade_if_insecure);
 
+  // Populate network isolation key from the factory params or from the resource
+  // request for navigation resources.
+  if (!request.trusted_network_isolation_key.IsEmpty()) {
+    DCHECK(!factory_params_->network_isolation_key);
+    url_request_->set_network_isolation_key(
+        request.trusted_network_isolation_key);
+  }
   if (factory_params_->network_isolation_key) {
+    DCHECK(request.trusted_network_isolation_key.IsEmpty());
     url_request_->set_network_isolation_key(
         factory_params_->network_isolation_key.value());
   }
@@ -686,6 +696,20 @@
     LogConcerningRequestHeaders(modified_headers,
                                 true /* added_during_redirect */);
 
+  // See if network isolation key needs to be updated.
+  // TODO(crbug.com/979296): Consider changing this code to copy an origin
+  // instead of creating one from a URL which lacks opacity information
+  // TODO(crbug.com/950069): Also add the case for kUpdateInitiatingFrameOrigin.
+  if ((update_network_isolation_key_on_redirect_ ==
+       mojom::UpdateNetworkIsolationKeyOnRedirect::
+           kUpdateTopFrameAndInitiatingFrameOrigin) &&
+      !url_request_->network_isolation_key().IsEmpty()) {
+    url::Origin new_origin = url::Origin::Create(*(deferred_redirect_url_));
+    url_request_->set_network_isolation_key(
+        net::NetworkIsolationKey(new_origin /* top frame origin */,
+                                 new_origin /* initiating frame origin */));
+  }
+
   deferred_redirect_url_.reset();
   new_redirect_url_ = new_url;
 
diff --git a/services/network/url_loader.h b/services/network/url_loader.h
index 5e9c7f4..25965a7 100644
--- a/services/network/url_loader.h
+++ b/services/network/url_loader.h
@@ -353,6 +353,11 @@
 
   std::unique_ptr<FileOpenerForUpload> file_opener_for_upload_;
 
+  // See detailed comment in
+  // mojom::network::URLRequest::update_network_isolation_key_on_redirect.
+  mojom::UpdateNetworkIsolationKeyOnRedirect
+      update_network_isolation_key_on_redirect_;
+
   base::WeakPtrFactory<URLLoader> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(URLLoader);
diff --git a/services/network/url_loader_factory.cc b/services/network/url_loader_factory.cc
index e92ded52..ecf52de 100644
--- a/services/network/url_loader_factory.cc
+++ b/services/network/url_loader_factory.cc
@@ -132,6 +132,21 @@
     return;
   }
 
+  // For navigation and worker script resources, the network isolation key may
+  // be set in the resource request and for sub-resources, it is set in params_.
+  // Fail if it is set in both as that could imply a compromised less trusted
+  // process filling up the resource request's trusted_network_isolation_key (It
+  // should only be filled up by a trusted process).
+  if (params_->network_isolation_key &&
+      !url_request.trusted_network_isolation_key.IsEmpty()) {
+    URLLoaderCompletionStatus status;
+    status.error_code = net::ERR_INVALID_ARGUMENT;
+    status.exists_in_cache = false;
+    status.completion_time = base::TimeTicks::Now();
+    client->OnComplete(status);
+    return;
+  }
+
   auto loader = std::make_unique<URLLoader>(
       context_->url_request_context(), network_service_client,
       context_->client(),
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index 9ac7c6e6..870f9a3 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -756,7 +756,9 @@
 
   void LoadAndVerifyCached(const GURL& url,
                            const net::NetworkIsolationKey& key,
-                           bool was_cached) {
+                           bool was_cached,
+                           bool is_navigation,
+                           bool expect_redirect = false) {
     ResourceRequest request = CreateResourceRequest("GET", url);
     request.load_flags |= net::LOAD_SKIP_CACHE_VALIDATION;
 
@@ -764,10 +766,18 @@
     base::RunLoop delete_run_loop;
     mojom::URLLoaderPtr loader;
     std::unique_ptr<URLLoader> url_loader;
-    static mojom::URLLoaderFactoryParams params;
+    mojom::URLLoaderFactoryParams params;
     params.process_id = mojom::kBrowserProcessId;
     params.is_corb_enabled = false;
-    params.network_isolation_key = key;
+
+    if (is_navigation) {
+      request.trusted_network_isolation_key = key;
+      request.update_network_isolation_key_on_redirect =
+          mojom::UpdateNetworkIsolationKeyOnRedirect::
+              kUpdateTopFrameAndInitiatingFrameOrigin;
+    } else {
+      params.network_isolation_key = key;
+    }
     url_loader = std::make_unique<URLLoader>(
         context(), nullptr /* network_service_client */,
         nullptr /* network_context_client */,
@@ -777,6 +787,11 @@
         resource_scheduler_client(), nullptr,
         nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
+    if (expect_redirect) {
+      client.RunUntilRedirectReceived();
+      loader->FollowRedirect({}, {}, base::nullopt);
+    }
+
     client.RunUntilComplete();
     delete_run_loop.Run();
 
@@ -3055,16 +3070,63 @@
   GURL url = test_server()->GetURL("/resource");
   url::Origin origin_a = url::Origin::Create(GURL("http://a.test/"));
   net::NetworkIsolationKey key_a(origin_a);
-  LoadAndVerifyCached(url, key_a, false /* was_cached */);
+  LoadAndVerifyCached(url, key_a, false /* was_cached */,
+                      false /* is_navigation */);
 
   // Load again with a different isolation key. The cached entry should not be
   // loaded.
   url::Origin origin_b = url::Origin::Create(GURL("http://b.test/"));
   net::NetworkIsolationKey key_b(origin_b);
-  LoadAndVerifyCached(url, key_b, false /* was_cached */);
+  LoadAndVerifyCached(url, key_b, false /* was_cached */,
+                      false /* is_navigation */);
 
   // Load again with the same isolation key. The cached entry should be loaded.
-  LoadAndVerifyCached(url, key_b, true /* was_cached */);
+  LoadAndVerifyCached(url, key_b, true /* was_cached */,
+                      false /* is_navigation */);
+}
+
+TEST_F(URLLoaderNetworkIsolationTest,
+       NavigationResourceCachedUsingNetworkIsolationKey) {
+  GURL url = test_server()->GetURL("othersite.test", "/main.html");
+  net::NetworkIsolationKey key_a(url::Origin::Create(url));
+  LoadAndVerifyCached(url, key_a, false /* was_cached */,
+                      true /* is_navigation */);
+
+  // Load again with a different isolation key. The cached entry should not be
+  // loaded.
+  GURL url_b = test_server()->GetURL("/main.html");
+  net::NetworkIsolationKey key_b(url::Origin::Create(url_b));
+  LoadAndVerifyCached(url_b, key_b, false /* was_cached */,
+                      true /* is_navigation */);
+
+  // Load again with the same isolation key. The cached entry should be loaded.
+  LoadAndVerifyCached(url_b, key_b, true /* was_cached */,
+                      true /* is_navigation */);
+}
+
+TEST_F(URLLoaderNetworkIsolationTest,
+       NavigationResourceRedirectNetworkIsolationKey) {
+  // Create a request that redirects to d.com/title1.html.
+  GURL url = test_server()->GetURL(
+      "/server-redirect-301?" +
+      test_server()->GetURL("othersite.test", "/title1.html").spec());
+  net::NetworkIsolationKey key(url::Origin::Create(url));
+  LoadAndVerifyCached(url, key, false /* was_cached */,
+                      true /* is_navigation */, true /* expect_redirect */);
+
+  // Now directly load now with the key using the redirected URL. This should be
+  // a cache hit.
+  GURL redirected_url = test_server()->GetURL("othersite.test", "/title1.html");
+  LoadAndVerifyCached(
+      redirected_url,
+      net::NetworkIsolationKey(url::Origin::Create(redirected_url)),
+      true /* was_cached */, true /* is_navigation */);
+
+  // A non-navigation resource with the same key and url should also be cached.
+  LoadAndVerifyCached(
+      redirected_url,
+      net::NetworkIsolationKey(url::Origin::Create(redirected_url)),
+      true /* was_cached */, false /* is_navigation */);
 }
 
 class TestSSLPrivateKey : public net::SSLPrivateKey {
diff --git a/storage/browser/fileapi/plugin_private_file_system_backend.cc b/storage/browser/fileapi/plugin_private_file_system_backend.cc
index d1e6a5d..fa76c81 100644
--- a/storage/browser/fileapi/plugin_private_file_system_backend.cc
+++ b/storage/browser/fileapi/plugin_private_file_system_backend.cc
@@ -13,6 +13,7 @@
 #include "base/bind.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
+#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/synchronization/lock.h"
 #include "base/task_runner_util.h"
@@ -196,14 +197,15 @@
   return false;
 }
 
-std::unique_ptr<storage::FileStreamReader>
+std::unique_ptr<FileStreamReader>
 PluginPrivateFileSystemBackend::CreateFileStreamReader(
     const FileSystemURL& url,
     int64_t offset,
     int64_t max_bytes_to_read,
     const base::Time& expected_modification_time,
     FileSystemContext* context) const {
-  return std::unique_ptr<storage::FileStreamReader>();
+  return base::WrapUnique(FileStreamReader::CreateForFileSystemFile(
+      context, url, offset, expected_modification_time));
 }
 
 std::unique_ptr<FileStreamWriter>
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index e17aa446..33c54e4e 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -4488,6 +4488,60 @@
           "--build-revision",
           "${got_revision}",
           "--test-machine-name",
+          "${buildername}",
+          "--use-skia-gold"
+        ],
+        "experiment_percentage": 100,
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "android_webview_pixel_skia_gold_test",
+        "non_precommit_args": [
+          "--upload-refimg-to-cloud-storage"
+        ],
+        "precommit_args": [
+          "--download-refimg-from-cloud-storage",
+          "--review-patch-issue",
+          "${patch_issue}",
+          "--review-patch-set",
+          "${patch_set}",
+          "--buildbucket-build-id",
+          "${buildbucket_build_id}"
+        ],
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "device_os": "MMB29Q",
+              "device_os_type": "userdebug",
+              "device_type": "bullhead",
+              "os": "Android"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "pixel",
+          "--show-stdout",
+          "--browser=android-webview-instrumentation",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--dont-restore-color-profile-after-test",
+          "--refimg-cloud-storage-bucket",
+          "chromium-gpu-archive/reference-images",
+          "--os-type",
+          "android",
+          "--build-revision",
+          "${got_revision}",
+          "--test-machine-name",
           "${buildername}"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
@@ -6762,6 +6816,61 @@
           "--build-revision",
           "${got_revision}",
           "--test-machine-name",
+          "${buildername}",
+          "--use-skia-gold"
+        ],
+        "experiment_percentage": 100,
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "pixel_skia_gold_test",
+        "non_precommit_args": [
+          "--upload-refimg-to-cloud-storage"
+        ],
+        "precommit_args": [
+          "--download-refimg-from-cloud-storage",
+          "--review-patch-issue",
+          "${patch_issue}",
+          "--review-patch-set",
+          "${patch_set}",
+          "--buildbucket-build-id",
+          "${buildbucket_build_id}"
+        ],
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "device_os": "P",
+              "device_os_type": "userdebug",
+              "device_type": "walleye",
+              "os": "Android",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "pixel",
+          "--show-stdout",
+          "--browser=android-chromium",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc \"--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer\"",
+          "--dont-restore-color-profile-after-test",
+          "--refimg-cloud-storage-bucket",
+          "chromium-gpu-archive/reference-images",
+          "--os-type",
+          "android",
+          "--build-revision",
+          "${got_revision}",
+          "--test-machine-name",
           "${buildername}"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 82b8bb7..cc7c46f3 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -2158,8 +2158,7 @@
       {
         "isolate_coverage_data": true,
         "name": "check_network_annotations",
-        "script": "check_network_annotations.py",
-        "swarming": {}
+        "script": "check_network_annotations.py"
       }
     ]
   },
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index de514d9e..45b80257 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -175,6 +175,41 @@
           '--download-refimg-from-cloud-storage',
         ],
       },
+      'pixel_skia': {
+        'name': 'android_webview_pixel_skia_gold_test',
+        'args': [
+          '--dont-restore-color-profile-after-test',
+          '--refimg-cloud-storage-bucket',
+          'chromium-gpu-archive/reference-images',
+          '--os-type',
+          '${os_type}',
+          '--build-revision',
+          '${got_revision}',
+          '--test-machine-name',
+          '${buildername}',
+          '--use-skia-gold',
+        ],
+        'non_precommit_args': [
+          '--upload-refimg-to-cloud-storage',
+        ],
+        'precommit_args': [
+          '--download-refimg-from-cloud-storage',
+          # Gerrit issue ID
+          '--review-patch-issue',
+          '${patch_issue}',
+          # Patch set number
+          '--review-patch-set',
+          '${patch_set}',
+          # Buildbucket ID
+          '--buildbucket-build-id',
+          '${buildbucket_build_id}',
+        ],
+        'swarming': {
+          'service_account': 'chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com'
+        },
+        'experiment_percentage': 100,
+        'telemetry_test_name': 'pixel',
+      },
     },
 
     'aura_gtests': {
@@ -3631,6 +3666,42 @@
           '--download-refimg-from-cloud-storage',
         ],
       },
+      'pixel_skia': {
+        'name': 'pixel_skia_gold_test',
+        'args': [
+          '--dont-restore-color-profile-after-test',
+          '--refimg-cloud-storage-bucket',
+          'chromium-gpu-archive/reference-images',
+          '--os-type',
+          '${os_type}',
+          '--build-revision',
+          '${got_revision}',
+          '--test-machine-name',
+          '${buildername}',
+          '--use-skia-gold',
+          '--extra-browser-args="--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer"',
+        ],
+        'non_precommit_args': [
+          '--upload-refimg-to-cloud-storage',
+        ],
+        'precommit_args': [
+          '--download-refimg-from-cloud-storage',
+          # Gerrit issue ID
+          '--review-patch-issue',
+          '${patch_issue}',
+          # Patch set number
+          '--review-patch-set',
+          '${patch_set}',
+          # Buildbucket ID
+          '--buildbucket-build-id',
+          '${buildbucket_build_id}',
+        ],
+        'swarming': {
+          'service_account': 'chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com'
+        },
+        'experiment_percentage': 100,
+        'telemetry_test_name': 'pixel',
+      },
     },
 
     'gpu_swiftshader_gtests': {
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 3b500ea..d70c8b3 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -110,7 +110,6 @@
       'linux-archive-rel': {
         'mixins': [
           'linux-archive-rel-args',
-          'linux-trusty',
         ],
         'additional_compile_targets': [
           'all',
@@ -3345,7 +3344,6 @@
       # linux-rel or ended up not being able to fold.
       'Linux Builder Code Coverage': {
         'mixins': [
-          'linux-trusty',
           'code-coverage',
         ],
         'additional_compile_targets': [
diff --git a/testing/merge_scripts/code_coverage/merge_results.py b/testing/merge_scripts/code_coverage/merge_results.py
index e07005df..3bb9b2f 100755
--- a/testing/merge_scripts/code_coverage/merge_results.py
+++ b/testing/merge_scripts/code_coverage/merge_results.py
@@ -131,17 +131,30 @@
   return 1 if (failed or bool(invalid_profiles)) else 0
 
 def mark_invalid_shards(bad_shards, summary_file, output_file):
+  if not bad_shards:
+    return
   shard_indices = []
-  with open(summary_file) as f:
-    summary = json.load(f)
+  try:
+    with open(summary_file) as f:
+      summary = json.load(f)
+  except (OSError, ValueError):
+    logging.warning('Could not read summary.json, not marking invalid shards')
+    return
 
   for i in range(len(summary['shards'])):
-    shard_id = summary['shards'][i]['task_id']
-    if shard_id in bad_shards:
+    shard_info = summary['shards'][i]
+    shard_id = (shard_info['task_id']
+                if shard_info and 'task_id' in shard_info
+                else 'unknown')
+    if shard_id in bad_shards or shard_id == 'unknown':
       shard_indices.append(i)
 
-  with open(output_file) as f:
-    output = json.load(f)
+  try:
+    with open(output_file) as f:
+      output = json.load(f)
+  except (OSError, ValueError):
+    logging.warning('Invalid/missing output.json, overwriting')
+    output = {}
   output.setdefault('missing_shards', [])
   output['missing_shards'].extend(shard_indices)
   with open(output_file, 'w') as f:
diff --git a/testing/merge_scripts/code_coverage/merge_results_test.py b/testing/merge_scripts/code_coverage/merge_results_test.py
index ce982c2..9a360be 100755
--- a/testing/merge_scripts/code_coverage/merge_results_test.py
+++ b/testing/merge_scripts/code_coverage/merge_results_test.py
@@ -225,6 +225,39 @@
     self.assertIn('missing_shards', written)
     self.assertEqual(written['missing_shards'], [0])
 
+  @mock.patch('__builtin__.open',
+              new_callable=mock.mock_open,
+              read_data='invalid data')
+  def test_mark_invalid_shards_bad_summary(self, _mo):
+    # Should not raise an exception.
+    raised_exception = False
+    try:
+      merge_results.mark_invalid_shards(['1234567890abcdeff'], 'dummy.json',
+                                        'o.json')
+    except:  # pylint: disable=bare-except
+      raised_exception = True
+    self.assertFalse(raised_exception, 'unexpected exception')
+
+  @mock.patch('__builtin__.open',
+              new_callable=mock.mock_open,
+              read_data=json.dumps(
+                  {'shards': [{'task_id': '1234567890abcdeff'}]}))
+  def test_mark_invalid_shards_bad_output(self, mo):
+    mock_result = mock.mock_open()
+    mock_write = mock.MagicMock()
+    mock_result.return_value.write = mock_write
+    mo.side_effect = (
+        mo.return_value,
+        mock.mock_open(read_data='invalid_data').return_value,
+        mock_result.return_value,
+    )
+    # Should succeed anyway.
+    merge_results.mark_invalid_shards(['1234567890abcdeff'], 'dummy.json',
+                                      'o.json')
+    written = json.loads(''.join(c[0][0] for c in mock_write.call_args_list))
+    self.assertIn('missing_shards', written)
+    self.assertEqual(written['missing_shards'], [0])
+
   def test_get_shards_to_retry(self):
     bad_profiles = [
         '/b/s/w/ir/tmp/t/tmpSvBRii/44b643576cf39f10/profraw/default-1.profraw',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 777df3f..0df50616 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -4177,7 +4177,7 @@
             ],
             "experiments": [
                 {
-                    "name": "Enabled_Pool_Four_Fifths_Origin_ThreeQuarters_20190430",
+                    "name": "Enabled_Pool_Four_Fifths_Origin_ThreeQuarters_20190710",
                     "params": {
                         "PerHostRatio": "0.75",
                         "PoolSizeRatio": "0.8"
diff --git a/third_party/blink/public/blink_typemaps.gni b/third_party/blink/public/blink_typemaps.gni
index 492f006..4d4b14d 100644
--- a/third_party/blink/public/blink_typemaps.gni
+++ b/third_party/blink/public/blink_typemaps.gni
@@ -23,6 +23,6 @@
   "//services/viz/public/cpp/compositing/surface_id.typemap",
   "//services/viz/public/cpp/compositing/surface_info.typemap",
   "//skia/public/interfaces/skbitmap_for_blink.typemap",
-  "//ui/display/mojo/display_rotation_for_blink.typemap",
+  "//ui/display/mojom/display_rotation_for_blink.typemap",
   "//ui/gfx/mojo/gpu_fence_handle_for_blink.typemap",
 ]
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 04e115b..1409102 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2183,7 +2183,7 @@
   kV8HTMLMediaElement_Remote_AttributeGetter = 2779,
   kV8RemotePlayback_WatchAvailability_Method = 2780,
   kV8RemotePlayback_Prompt_Method = 2781,
-  kLayoutJankExplicitlyRequested = 2782,
+  kLayoutShiftExplicitlyRequested = 2782,
   kMediaSessionSkipAd = 2783,
   kAdFrameSizeIntervention = 2784,
   kV8UserActivation_HasBeenActive_AttributeGetter = 2785,
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
index 0609b012..ee870d8 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -91,11 +91,6 @@
              : nullptr;
 }
 
-bool IsBaselineKeyword(CSSValueID id) {
-  return css_property_parser_helpers::IdentMatches<
-      CSSValueID::kFirst, CSSValueID::kLast, CSSValueID::kBaseline>(id);
-}
-
 CSSValueID GetBaselineKeyword(CSSValue& value) {
   auto* value_pair = DynamicTo<CSSValuePair>(value);
   if (!value_pair) {
@@ -429,6 +424,11 @@
 
 }  // namespace
 
+bool IsBaselineKeyword(CSSValueID id) {
+  return css_property_parser_helpers::IdentMatches<
+      CSSValueID::kFirst, CSSValueID::kLast, CSSValueID::kBaseline>(id);
+}
+
 bool IsSelfPositionKeyword(CSSValueID id) {
   return css_property_parser_helpers::IdentMatches<
       CSSValueID::kStart, CSSValueID::kEnd, CSSValueID::kCenter,
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.h b/third_party/blink/renderer/core/css/properties/css_parsing_utils.h
index a1af42a..dbb113f 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.h
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.h
@@ -41,6 +41,7 @@
 
 constexpr size_t kMaxNumAnimationLonghands = 8;
 
+bool IsBaselineKeyword(CSSValueID id);
 bool IsSelfPositionKeyword(CSSValueID);
 bool IsSelfPositionOrLeftOrRightKeyword(CSSValueID);
 bool IsContentPositionKeyword(CSSValueID);
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
index b25a1e8..0ddf9c8 100644
--- a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/stl_util.h"
+#include "third_party/blink/renderer/core/css/css_content_distribution_value.h"
 #include "third_party/blink/renderer/core/css/css_font_family_value.h"
 #include "third_party/blink/renderer/core/css/css_identifier_value.h"
 #include "third_party/blink/renderer/core/css/css_initial_value.h"
@@ -2542,18 +2543,28 @@
   DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceContent).length(), 2u);
 
   CSSParserTokenRange range_copy = range;
+  bool is_baseline = css_parsing_utils::IsBaselineKeyword(range.Peek().Id());
   const CSSValue* align_content_value =
       To<Longhand>(GetCSSPropertyAlignContent())
           .ParseSingleValue(range, context, local_context);
   if (!align_content_value)
     return false;
 
-  if (range.AtEnd())
-    range = range_copy;
+  const CSSValue* justify_content_value = nullptr;
+  if (range.AtEnd()) {
+    if (is_baseline) {
+      justify_content_value = MakeGarbageCollected<CSSContentDistributionValue>(
+          CSSValueID::kInvalid, CSSValueID::kStart, CSSValueID::kInvalid);
+    } else {
+      range = range_copy;
+    }
+  }
+  if (!justify_content_value) {
+    justify_content_value =
+        To<Longhand>(GetCSSPropertyJustifyContent())
+            .ParseSingleValue(range, context, local_context);
+  }
 
-  const CSSValue* justify_content_value =
-      To<Longhand>(GetCSSPropertyJustifyContent())
-          .ParseSingleValue(range, context, local_context);
   if (!justify_content_value || !range.AtEnd())
     return false;
 
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 181f0871..7ae4b5e 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -2357,10 +2357,10 @@
 #define PROPAGATE_FROM(source, getter, setter) \
   PROPAGATE_VALUE(source->getter(), getter, setter);
 
-#define PROPAGATE_VALUE(value, getter, setter) \
-  if ((viewport_style.getter()) != (value)) {  \
-    new_viewport_style->setter(value);         \
-    changed = true;                            \
+#define PROPAGATE_VALUE(value, getter, setter)     \
+  if ((new_viewport_style->getter()) != (value)) { \
+    new_viewport_style->setter(value);             \
+    changed = true;                                \
   }
 
   // Writing mode and direction
@@ -2473,7 +2473,6 @@
     PROPAGATE_VALUE(overflow_y, OverflowY, SetOverflowY)
     PROPAGATE_VALUE(overflow_anchor, OverflowAnchor, SetOverflowAnchor);
 
-    // TODO: Should this even be here?
     if (IsInMainFrame()) {
       using OverscrollBehaviorType =
           cc::OverscrollBehavior::OverscrollBehaviorType;
@@ -4328,8 +4327,7 @@
 }
 
 bool Document::IsTrustedTypesEnabledForDoc() const {
-  return SecurityContext::RequireTrustedTypes() &&
-         RuntimeEnabledFeatures::TrustedDOMTypesEnabled(this);
+  return ExecutionContext::RequireTrustedTypes();
 }
 
 void Document::write(v8::Isolate* isolate,
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.cc b/third_party/blink/renderer/core/execution_context/execution_context.cc
index 8f1ae9a..c173865 100644
--- a/third_party/blink/renderer/core/execution_context/execution_context.cc
+++ b/third_party/blink/renderer/core/execution_context/execution_context.cc
@@ -309,4 +309,9 @@
   return false;
 }
 
+bool ExecutionContext::RequireTrustedTypes() const {
+  return GetSecurityContext().TrustedTypesRequiredByPolicy() &&
+         RuntimeEnabledFeatures::TrustedDOMTypesEnabled(this);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.h b/third_party/blink/renderer/core/execution_context/execution_context.h
index 73bd1fa..084fdb38 100644
--- a/third_party/blink/renderer/core/execution_context/execution_context.h
+++ b/third_party/blink/renderer/core/execution_context/execution_context.h
@@ -312,6 +312,8 @@
   bool FeaturePolicyFeatureObserved(
       mojom::FeaturePolicyFeature feature) override;
 
+  bool RequireTrustedTypes() const;
+
  protected:
   ExecutionContext(v8::Isolate* isolate,
                    Agent* agent,
diff --git a/third_party/blink/renderer/core/execution_context/security_context.cc b/third_party/blink/renderer/core/execution_context/security_context.cc
index 479b162..b87c486a 100644
--- a/third_party/blink/renderer/core/execution_context/security_context.cc
+++ b/third_party/blink/renderer/core/execution_context/security_context.cc
@@ -176,7 +176,7 @@
   require_safe_types_ = true;
 }
 
-bool SecurityContext::RequireTrustedTypes() const {
+bool SecurityContext::TrustedTypesRequiredByPolicy() const {
   return require_safe_types_;
 }
 
diff --git a/third_party/blink/renderer/core/execution_context/security_context.h b/third_party/blink/renderer/core/execution_context/security_context.h
index a376caf..0324d2a 100644
--- a/third_party/blink/renderer/core/execution_context/security_context.h
+++ b/third_party/blink/renderer/core/execution_context/security_context.h
@@ -98,8 +98,8 @@
   String addressSpaceForBindings() const;
 
   void SetRequireTrustedTypes();
-  bool RequireTrustedTypes() const;
   void SetRequireTrustedTypesForTesting();  // Skips sanity checks.
+  bool TrustedTypesRequiredByPolicy() const;
 
   // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-insecure-navigations-set
   void SetInsecureNavigationsSet(const WebVector<unsigned>& set) {
diff --git a/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc b/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc
index c4a1c22..2521361 100644
--- a/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc
+++ b/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc
@@ -69,8 +69,7 @@
 }
 
 void ExecutionContextCSPDelegate::SetRequireTrustedTypes() {
-  if (RuntimeEnabledFeatures::TrustedDOMTypesEnabled(execution_context_))
-    GetSecurityContext().SetRequireTrustedTypes();
+  GetSecurityContext().SetRequireTrustedTypes();
 }
 
 void ExecutionContextCSPDelegate::AddInsecureRequestPolicy(
diff --git a/third_party/blink/renderer/core/inspector/inspect_tools.cc b/third_party/blink/renderer/core/inspector/inspect_tools.cc
index 287de15..9adeb94 100644
--- a/third_party/blink/renderer/core/inspector/inspect_tools.cc
+++ b/third_party/blink/renderer/core/inspector/inspect_tools.cc
@@ -100,10 +100,9 @@
 
 SearchingForNodeTool::SearchingForNodeTool(InspectorDOMAgent* dom_agent,
                                            bool ua_shadow,
-                                           const String& config)
+                                           const std::vector<uint8_t>& config)
     : dom_agent_(dom_agent), ua_shadow_(ua_shadow) {
-  std::unique_ptr<protocol::Value> value =
-      protocol::StringUtil::parseJSON(config);
+  auto value = protocol::Value::parseBinary(config.data(), config.size());
   if (!value)
     return;
   protocol::ErrorSupport errors;
diff --git a/third_party/blink/renderer/core/inspector/inspect_tools.h b/third_party/blink/renderer/core/inspector/inspect_tools.h
index da47234f..ede4dec 100644
--- a/third_party/blink/renderer/core/inspector/inspect_tools.h
+++ b/third_party/blink/renderer/core/inspector/inspect_tools.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECT_TOOLS_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECT_TOOLS_H_
 
+#include <vector>
 #include <v8-inspector.h>
 #include "base/macros.h"
 #include "third_party/blink/renderer/core/inspector/inspector_overlay_agent.h"
@@ -20,7 +21,7 @@
  public:
   SearchingForNodeTool(InspectorDOMAgent* dom_agent,
                        bool ua_shadow,
-                       const String& highlight_config);
+                       const std::vector<uint8_t>& highlight_config);
 
  private:
   bool HandleInputEvent(LocalFrameView* frame_view,
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
index 1913052..99bf4d3c 100644
--- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -336,7 +336,7 @@
       show_size_on_resize_(&agent_state_, false),
       paused_in_debugger_message_(&agent_state_, String()),
       inspect_mode_(&agent_state_, protocol::Overlay::InspectModeEnum::None),
-      inspect_mode_protocol_config_(&agent_state_, String()) {}
+      inspect_mode_protocol_config_(&agent_state_, std::vector<uint8_t>()) {}
 
 InspectorOverlayAgent::~InspectorOverlayAgent() {
   DCHECK(!overlay_page_);
@@ -397,7 +397,7 @@
   setShowViewportSizeOnResize(false);
   paused_in_debugger_message_.Clear();
   inspect_mode_.Set(protocol::Overlay::InspectModeEnum::None);
-  inspect_mode_protocol_config_.Set(String());
+  inspect_mode_protocol_config_.Set(std::vector<uint8_t>());
   if (overlay_page_) {
     overlay_page_->WillBeDestroyed();
     overlay_page_.Clear();
@@ -1082,10 +1082,11 @@
         String("Unknown mode \"" + mode + "\" was provided."));
   }
 
-  String serialized_config =
-      highlight_inspector_object.isJust()
-          ? highlight_inspector_object.fromJust()->toJSON()
-          : String();
+  std::vector<uint8_t> serialized_config;
+  if (highlight_inspector_object.isJust()) {
+    serialized_config =
+        highlight_inspector_object.fromJust()->serializeToBinary();
+  }
   std::unique_ptr<InspectorHighlightConfig> config;
   Response response = HighlightConfigFromInspectorObject(
       std::move(highlight_inspector_object), &config);
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h
index 4abc8d7c..ab0b77fb 100644
--- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h
@@ -240,7 +240,7 @@
   InspectorAgentState::Boolean show_size_on_resize_;
   InspectorAgentState::String paused_in_debugger_message_;
   InspectorAgentState::String inspect_mode_;
-  InspectorAgentState::String inspect_mode_protocol_config_;
+  InspectorAgentState::Bytes inspect_mode_protocol_config_;
   DISALLOW_COPY_AND_ASSIGN(InspectorOverlayAgent);
 };
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
index cf33ac9..731fce0e 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -1054,8 +1054,20 @@
     // Deal with marker's margin. It happens only when marker needs to occupy
     // the whole line.
     DCHECK(child.ListMarkerOccupiesWholeLine());
+    // Because the marker is laid out as a normal block child, its inline size
+    // is extended to fill up the space. Compute the regular marker size from
+    // the first child.
+    const NGPhysicalContainerFragment& marker_fragment =
+        layout_result->PhysicalFragment();
+    DCHECK(!marker_fragment.Children().empty());
+    const NGPhysicalFragment& marker_child_fragment =
+        *marker_fragment.Children().front();
+    LayoutUnit marker_inline_size =
+        marker_child_fragment.Size()
+            .ConvertToLogical(ConstraintSpace().GetWritingMode())
+            .inline_size;
     auto_margins.inline_start = NGUnpositionedListMarker(To<NGBlockNode>(child))
-                                    .InlineOffset(fragment.InlineSize());
+                                    .InlineOffset(marker_inline_size);
     auto_margins.inline_end = opportunity.rect.InlineSize() -
                               fragment.InlineSize() - auto_margins.inline_start;
   } else {
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.cc b/third_party/blink/renderer/core/svg/graphics/svg_image.cc
index 1a9feed0..aeb0d040 100644
--- a/third_party/blink/renderer/core/svg/graphics/svg_image.cc
+++ b/third_party/blink/renderer/core/svg/graphics/svg_image.cc
@@ -839,6 +839,10 @@
   return kSizeAvailable;
 }
 
+bool SVGImage::IsSizeAvailable() {
+  return SvgRootElement(page_.Get());
+}
+
 String SVGImage::FilenameExtension() const {
   return "svg";
 }
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.h b/third_party/blink/renderer/core/svg/graphics/svg_image.h
index 1b2232c..29fe1bf 100644
--- a/third_party/blink/renderer/core/svg/graphics/svg_image.h
+++ b/third_party/blink/renderer/core/svg/graphics/svg_image.h
@@ -126,7 +126,7 @@
 
  protected:
   // Whether or not size is available yet.
-  bool IsSizeAvailable() override { return !!page_; }
+  bool IsSizeAvailable() override;
 
  private:
   // Accesses m_page.
@@ -247,6 +247,7 @@
   FRIEND_TEST_ALL_PREFIXES(SVGImageTest, SupportsSubsequenceCaching);
   FRIEND_TEST_ALL_PREFIXES(SVGImageTest, LayoutShiftTrackerDisabled);
   FRIEND_TEST_ALL_PREFIXES(SVGImageTest, SetSizeOnVisualViewport);
+  FRIEND_TEST_ALL_PREFIXES(SVGImageTest, IsSizeAvailable);
 };
 
 DEFINE_IMAGE_TYPE_CASTS(SVGImage);
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc b/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc
index 90f51f29..078ece6 100644
--- a/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc
+++ b/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc
@@ -197,6 +197,18 @@
             GetImage().GetPageForTesting()->GetVisualViewport().Size());
 }
 
+TEST_F(SVGImageTest, IsSizeAvailable) {
+  const bool kShouldPause = false;
+  Load("<svg xmlns='http://www.w3.org/2000/svg'></svg>", kShouldPause);
+  EXPECT_TRUE(GetImage().IsSizeAvailable());
+
+  Load("<notsvg></notsvg>", kShouldPause);
+  EXPECT_FALSE(GetImage().IsSizeAvailable());
+
+  Load("<notsvg xmlns='http://www.w3.org/2000/svg'></notsvg>", kShouldPause);
+  EXPECT_FALSE(GetImage().IsSizeAvailable());
+}
+
 class SVGImageSimTest : public SimTest {};
 
 TEST_F(SVGImageSimTest, PageVisibilityHiddenToVisible) {
diff --git a/third_party/blink/renderer/core/timing/layout_shift.cc b/third_party/blink/renderer/core/timing/layout_shift.cc
index b11ba21..fd22888 100644
--- a/third_party/blink/renderer/core/timing/layout_shift.cc
+++ b/third_party/blink/renderer/core/timing/layout_shift.cc
@@ -26,7 +26,7 @@
 }
 
 PerformanceEntryType LayoutShift::EntryTypeEnum() const {
-  return PerformanceEntry::EntryType::kLayoutJank;
+  return PerformanceEntry::EntryType::kLayoutShift;
 }
 
 void LayoutShift::BuildJSONValue(V8ObjectBuilder& builder) const {
diff --git a/third_party/blink/renderer/core/timing/performance.cc b/third_party/blink/renderer/core/timing/performance.cc
index 965ed76c..c3d009b 100644
--- a/third_party/blink/renderer/core/timing/performance.cc
+++ b/third_party/blink/renderer/core/timing/performance.cc
@@ -248,9 +248,7 @@
       break;
     case PerformanceEntry::kTaskAttribution:
       break;
-    case PerformanceEntry::kLayoutJank:
-      UseCounter::Count(GetExecutionContext(),
-                        WebFeature::kLayoutJankExplicitlyRequested);
+    case PerformanceEntry::kLayoutShift:
       for (const auto& layout_jank : layout_jank_buffer_)
         entries.push_back(layout_jank);
       break;
diff --git a/third_party/blink/renderer/core/timing/performance_entry.cc b/third_party/blink/renderer/core/timing/performance_entry.cc
index 862b03e..67aa2304 100644
--- a/third_party/blink/renderer/core/timing/performance_entry.cc
+++ b/third_party/blink/renderer/core/timing/performance_entry.cc
@@ -82,7 +82,7 @@
   if (entry_type == performance_entry_names::kElement)
     return kElement;
   if (entry_type == performance_entry_names::kLayoutShift)
-    return kLayoutJank;
+    return kLayoutShift;
   if (entry_type == performance_entry_names::kLargestContentfulPaint)
     return kLargestContentfulPaint;
   return kInvalid;
diff --git a/third_party/blink/renderer/core/timing/performance_entry.h b/third_party/blink/renderer/core/timing/performance_entry.h
index 1b73d28b..68c90d3 100644
--- a/third_party/blink/renderer/core/timing/performance_entry.h
+++ b/third_party/blink/renderer/core/timing/performance_entry.h
@@ -65,7 +65,7 @@
     kEvent = 1 << 7,
     kFirstInput = 1 << 8,
     kElement = 1 << 9,
-    kLayoutJank = 1 << 10,
+    kLayoutShift = 1 << 10,
     kLargestContentfulPaint = 1 << 11,
   };
 
diff --git a/third_party/blink/renderer/core/timing/performance_observer.cc b/third_party/blink/renderer/core/timing/performance_observer.cc
index ec1dc4c..bb135403 100644
--- a/third_party/blink/renderer/core/timing/performance_observer.cc
+++ b/third_party/blink/renderer/core/timing/performance_observer.cc
@@ -196,9 +196,9 @@
     }
     filter_options_ |= entry_type;
   }
-  if (filter_options_ & PerformanceEntry::kLayoutJank) {
+  if (filter_options_ & PerformanceEntry::kLayoutShift) {
     UseCounter::Count(GetExecutionContext(),
-                      WebFeature::kLayoutJankExplicitlyRequested);
+                      WebFeature::kLayoutShiftExplicitlyRequested);
   }
   if (is_registered_)
     performance_->UpdatePerformanceObserverFilterOptions();
diff --git a/third_party/blink/renderer/core/timing/window_performance.cc b/third_party/blink/renderer/core/timing/window_performance.cc
index 99336cd5..a7c70f6 100644
--- a/third_party/blink/renderer/core/timing/window_performance.cc
+++ b/third_party/blink/renderer/core/timing/window_performance.cc
@@ -434,7 +434,7 @@
       now(), jank_fraction, input_detected,
       input_detected ? MonotonicTimeToDOMHighResTimeStamp(input_timestamp)
                      : 0.0);
-  if (HasObserverFor(PerformanceEntry::kLayoutJank))
+  if (HasObserverFor(PerformanceEntry::kLayoutShift))
     NotifyObserversOfEntry(*entry);
   AddLayoutJankBuffer(*entry);
 }
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
index 499b062..e2bfaeb 100644
--- a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
+++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
@@ -117,8 +117,7 @@
 }  // namespace
 
 bool RequireTrustedTypesCheck(const ExecutionContext* execution_context) {
-  return execution_context &&
-         execution_context->GetSecurityContext().RequireTrustedTypes();
+  return execution_context && execution_context->RequireTrustedTypes();
 }
 
 String GetStringFromTrustedType(
diff --git a/third_party/blink/renderer/devtools/front_end/audits/AuditsStartView.js b/third_party/blink/renderer/devtools/front_end/audits/AuditsStartView.js
index 4e6d28b4..b17f92a3 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/AuditsStartView.js
+++ b/third_party/blink/renderer/devtools/front_end/audits/AuditsStartView.js
@@ -25,8 +25,7 @@
     if (!runtimeSetting || !runtimeSetting.options)
       throw new Error(`${settingName} is not a setting with options`);
 
-    const control = new Audits.RadioSetting(runtimeSetting.options, runtimeSetting.setting);
-    control.element.title = runtimeSetting.description;
+    const control = new Audits.RadioSetting(runtimeSetting.options, runtimeSetting.setting, runtimeSetting.description);
     parentElement.appendChild(control.element);
   }
 
diff --git a/third_party/blink/renderer/devtools/front_end/audits/RadioSetting.js b/third_party/blink/renderer/devtools/front_end/audits/RadioSetting.js
index fabf8aab..7d85dbd 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/RadioSetting.js
+++ b/third_party/blink/renderer/devtools/front_end/audits/RadioSetting.js
@@ -6,12 +6,15 @@
   /**
    * @param {!Array<!{value: string, label: string}>} options
    * @param {!Common.Setting} setting
+   * @param {string} description
    */
-  constructor(options, setting) {
+  constructor(options, setting, description) {
     this._setting = setting;
     this._options = options;
 
     this.element = createElement('div', 'audits-radio-group');
+    this.element.title = description;
+    UI.ARIAUtils.setDescription(this.element, description);
 
     this._radioElements = [];
     for (const option of this._options) {
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
index af06a4e..3ea1a9d6 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
@@ -631,8 +631,6 @@
   volume_control_container_->ParserAppendChild(mute_button_);
   button_panel->ParserAppendChild(volume_control_container_);
 
-  MaybeParserAppendChild(button_panel, picture_in_picture_button_);
-
   button_panel->ParserAppendChild(fullscreen_button_);
 
   button_panel->ParserAppendChild(overflow_menu_);
@@ -1214,9 +1212,7 @@
       std::make_pair(fullscreen_button_.Get(), true),
       std::make_pair(current_time_display_.Get(), true),
       std::make_pair(duration_display_.Get(), true),
-      picture_in_picture_button_.Get()
-          ? std::make_pair(picture_in_picture_button_.Get(), false)
-          : std::make_pair(nullptr, false),
+      std::make_pair(picture_in_picture_button_.Get(), false),
       std::make_pair(cast_button_.Get(), false),
       std::make_pair(download_button_.Get(), false),
       std::make_pair(toggle_closed_captions_button_.Get(), false),
@@ -1942,8 +1938,7 @@
       mute_button_.Get(),
       volume_slider_.Get(),
       toggle_closed_captions_button_.Get(),
-      picture_in_picture_button_.Get() ? picture_in_picture_button_.Get()
-                                       : nullptr,
+      picture_in_picture_button_.Get(),
       cast_button_.Get(),
       current_time_display_.Get(),
       duration_display_.Get(),
diff --git a/third_party/blink/renderer/modules/native_file_system/file_system_directory_handle.idl b/third_party/blink/renderer/modules/native_file_system/file_system_directory_handle.idl
index 1e96b32..5cb829a 100644
--- a/third_party/blink/renderer/modules/native_file_system/file_system_directory_handle.idl
+++ b/third_party/blink/renderer/modules/native_file_system/file_system_directory_handle.idl
@@ -5,6 +5,7 @@
 // https://wicg.github.io/native-file-system/#filesystemdirectoryhandle
 [
     Exposed=(Window,Worker),
+    SecureContext,
     RuntimeEnabled=NativeFileSystem,
     ImplementedAs=NativeFileSystemDirectoryHandle
 ] interface FileSystemDirectoryHandle : FileSystemHandle {
diff --git a/third_party/blink/renderer/modules/native_file_system/file_system_file_handle.idl b/third_party/blink/renderer/modules/native_file_system/file_system_file_handle.idl
index bd4170e7..2dc91c5c 100644
--- a/third_party/blink/renderer/modules/native_file_system/file_system_file_handle.idl
+++ b/third_party/blink/renderer/modules/native_file_system/file_system_file_handle.idl
@@ -5,6 +5,7 @@
 // https://wicg.github.io/native-file-system/#filesystemfilehandle
 [
     Exposed=(Window,Worker),
+    SecureContext,
     RuntimeEnabled=NativeFileSystem,
     ImplementedAs=NativeFileSystemFileHandle
 ] interface FileSystemFileHandle : FileSystemHandle {
diff --git a/third_party/blink/renderer/modules/native_file_system/file_system_handle.idl b/third_party/blink/renderer/modules/native_file_system/file_system_handle.idl
index 97d0efd..39c7edc 100644
--- a/third_party/blink/renderer/modules/native_file_system/file_system_handle.idl
+++ b/third_party/blink/renderer/modules/native_file_system/file_system_handle.idl
@@ -5,6 +5,7 @@
 // https://wicg.github.io/native-file-system/#filesystemhandle
 [
     Exposed=(Window,Worker),
+    SecureContext,
     RuntimeEnabled=NativeFileSystem,
     ImplementedAs=NativeFileSystemHandle
 ] interface FileSystemHandle {
diff --git a/third_party/blink/renderer/modules/native_file_system/file_system_writer.idl b/third_party/blink/renderer/modules/native_file_system/file_system_writer.idl
index 52ebb44e..8fb8589 100644
--- a/third_party/blink/renderer/modules/native_file_system/file_system_writer.idl
+++ b/third_party/blink/renderer/modules/native_file_system/file_system_writer.idl
@@ -5,6 +5,7 @@
 // https://wicg.github.io/native-file-system/#filesystemwriter
 [
     Exposed=(Window,Worker),
+    SecureContext,
     ImplementedAs=NativeFileSystemWriter,
     RuntimeEnabled=NativeFileSystem
 ] interface FileSystemWriter {
diff --git a/third_party/blink/renderer/modules/native_file_system/window_native_file_system.idl b/third_party/blink/renderer/modules/native_file_system/window_native_file_system.idl
index 574d4b5..f17cd62 100644
--- a/third_party/blink/renderer/modules/native_file_system/window_native_file_system.idl
+++ b/third_party/blink/renderer/modules/native_file_system/window_native_file_system.idl
@@ -4,10 +4,11 @@
 
 // https://wicg.github.io/native-file-system/#api-choosefilesystementries
 [
+    SecureContext,
     RuntimeEnabled=NativeFileSystem,
     ImplementedAs=WindowNativeFileSystem
 ] partial interface Window {
-    [CallWith=ScriptState, SecureContext]
+    [CallWith=ScriptState]
     Promise<(FileSystemHandle or sequence<FileSystemHandle>)>
         chooseFileSystemEntries(optional ChooseFileSystemEntriesOptions options);
 };
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.cc b/third_party/blink/renderer/platform/graphics/canvas_resource.cc
index 836cb17..9cdb191 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource.cc
@@ -886,6 +886,13 @@
       context_provider_wrapper_, owning_thread_id_, is_origin_top_left_,
       std::move(release_callback));
 
+  // The StaticBitmapImage is used for readbacks which may modify the texture
+  // params. We reset this when the image is destroyed but it is important to
+  // also do it here in case we try to send the resource to the display
+  // compositor while the |image| is still alive.
+  if (!is_cross_thread())
+    owning_thread_data().needs_gl_filter_reset = true;
+
   DCHECK(image);
   return image;
 }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
index 4d5d2d37f..2af2d18c 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -553,8 +553,14 @@
     if (!IsValid())
       return nullptr;
 
-    EndWriteAccess();
-    return resource_->Bitmap();
+    if (!cached_snapshot_) {
+      EndWriteAccess();
+      cached_snapshot_ = resource_->Bitmap();
+    }
+
+    DCHECK(cached_snapshot_);
+    DCHECK(!current_resource_has_write_access_);
+    return cached_snapshot_;
   }
 
   void WillDraw() override {
@@ -563,6 +569,11 @@
     if (IsGpuContextLost())
       return;
 
+    // Since the resource will be updated, the cached snapshot is no longer
+    // valid. Note that it is important to release this reference here to not
+    // trigger copy-on-write below from the resource ref in the snapshot.
+    cached_snapshot_.reset();
+
     if (DoCopyOnWrite()) {
       DCHECK(!current_resource_has_write_access_)
           << "Write access must be released before sharing the resource";
@@ -692,6 +703,7 @@
   const bool is_overlay_candidate_;
   bool current_resource_has_write_access_ = false;
   scoped_refptr<CanvasResource> resource_;
+  scoped_refptr<StaticBitmapImage> cached_snapshot_;
 };
 
 // This class does nothing except answering to ProduceCanvasResource() by piping
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index 2a4cd20..8c3458b 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -543,6 +543,14 @@
         ],
     },
     {
+        'paths': ['third_party/blink/renderer/core/inspector'],
+        'allowed': [
+            # Devtools binary protocol uses std::vector<uint8_t> for serialized
+            # objects.
+            'std::vector',
+        ],
+    },
+    {
         'paths': ['third_party/blink/renderer/core/inspector/inspector_performance_agent.cc'],
         'allowed': [
             'base::subtle::TimeTicksNowIgnoringOverride',
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index fb39edd..78b77ff2 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -476677,7 +476677,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/browsers/chrome_android.py": [
-   "3c277a567d7f06f39dfc02cb18d5229c7570a131",
+   "31ae7995b4010a6fcef0c585eed1128815837fcb",
    "support"
   ],
   "tools/wptrunner/wptrunner/browsers/edge.py": [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-invalid.html
new file mode 100644
index 0000000..3fcd9a8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-invalid.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Box Alignment Level 3: parsing place-content with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-content">
+<meta name="assert" content="place-content supports only the grammar '<align-content> <justify-content>?'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("place-content", "auto");
+
+test_invalid_value("place-content", "self-end unsafe");
+test_invalid_value("place-content", "self-start");
+
+test_invalid_value("place-content", "left");
+test_invalid_value("place-content", "unsafe right");
+test_invalid_value("place-content", "left normal");
+test_invalid_value("place-content", "unsafe right stretch");
+
+test_invalid_value("place-content", "normal flex-start baseline");
+test_invalid_value("place-content", "first baseline first baseline");
+
+test_invalid_value("place-content", "baseline safe");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-valid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-valid.html
new file mode 100644
index 0000000..a83aa4c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-valid.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Box Alignment Level 3: parsing place-content with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-content">
+<meta name="assert" content="place-content supports the full grammar '<align-content> <justify-content>?'.">
+<meta name="assert" content="<baseline-position> and <baseline-position> start are equivalent.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("place-content", "normal normal", "normal");
+
+test_valid_value("place-content", "first baseline", "baseline start");
+test_valid_value("place-content", "baseline", "baseline start");
+test_valid_value("place-content", "first baseline start", "baseline start");
+test_valid_value("place-content", "last baseline", "last baseline start");
+test_valid_value("place-content", "first baseline stretch", "baseline stretch");
+test_valid_value("place-content", "last baseline flex-start");
+
+test_valid_value("place-content", "baseline stretch");
+
+test_valid_value("place-content", "space-between");
+test_valid_value("place-content", "space-around");
+test_valid_value("place-content", "space-evenly");
+test_valid_value("place-content", "stretch");
+
+test_valid_value("place-content", "center");
+test_valid_value("place-content", "end");
+test_valid_value("place-content", "flex-start flex-start", "flex-start");
+test_valid_value("place-content", "unsafe end unsafe end", "unsafe end");
+test_valid_value("place-content", "safe flex-start");
+
+test_valid_value("place-content", "normal stretch");
+test_valid_value("place-content", "baseline space-around");
+test_valid_value("place-content", "space-evenly unsafe end");
+test_valid_value("place-content", "center normal");
+
+test_valid_value("place-content", "normal right");
+test_valid_value("place-content", "baseline unsafe left");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-invalid.html
new file mode 100644
index 0000000..9468d30
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-invalid.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Box Alignment Level 3: parsing place-items with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-items">
+<meta name="assert" content="place-items supports only the grammar '<align-items> <justify-items>?'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("place-items", "auto");
+
+test_invalid_value("place-items", "space-around");
+test_invalid_value("place-items", "space-between");
+test_invalid_value("place-items", "space-evenly");
+
+test_invalid_value("place-items", "left");
+test_invalid_value("place-items", "unsafe right");
+test_invalid_value("place-items", "left baseline");
+test_invalid_value("place-items", "unsafe right flex-end");
+
+test_invalid_value("place-items", "legacy center");
+test_invalid_value("place-items", "legacy left");
+test_invalid_value("place-items", "legacy");
+test_invalid_value("place-items", "legacy right flex-start");
+test_invalid_value("place-items", "legacy normal");
+
+test_invalid_value("place-items", "normal flex-start baseline");
+
+test_invalid_value("place-items", "baseline safe");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-valid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-valid.html
new file mode 100644
index 0000000..72179bf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-valid.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Box Alignment Level 3: parsing place-items with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-items">
+<meta name="assert" content="place-items supports the full grammar '<align-items> <justify-items>?'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("place-items", "normal");
+test_valid_value("place-items", "stretch stretch", "stretch");
+
+test_valid_value("place-items", "first baseline", "baseline");
+test_valid_value("place-items", "last baseline last baseline", "last baseline");
+
+test_valid_value("place-items", "center");
+test_valid_value("place-items", "end end", "end");
+test_valid_value("place-items", "self-start");
+test_valid_value("place-items", "flex-end");
+test_valid_value("place-items", "unsafe center unsafe center", "unsafe center");
+test_valid_value("place-items", "safe self-end");
+
+test_valid_value("place-items", "stretch baseline");
+test_valid_value("place-items", "last baseline center");
+test_valid_value("place-items", "safe self-end normal");
+
+test_valid_value("place-items", "normal right");
+test_valid_value("place-items", "baseline unsafe left");
+
+test_valid_value("place-items", "flex-end legacy");
+test_valid_value("place-items", "stretch legacy left");
+test_valid_value("place-items", "first baseline right legacy", "baseline legacy right");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-invalid.html
new file mode 100644
index 0000000..8a7a2ab
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-invalid.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Box Alignment Level 3: parsing place-self with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-self">
+<meta name="assert" content="place-self supports only the grammar '<align-self> <justify-self>?'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("place-self", "space-around");
+test_invalid_value("place-self", "space-between");
+test_invalid_value("place-self", "space-evenly");
+
+test_invalid_value("place-self", "right");
+test_invalid_value("place-self", "unsafe left");
+test_invalid_value("place-self", "right start");
+test_invalid_value("place-self", "unsafe left stretch");
+
+test_invalid_value("place-self", "normal flex-start baseline");
+
+test_invalid_value("place-self", "baseline safe");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-valid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-valid.html
new file mode 100644
index 0000000..36a8bd5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-valid.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Box Alignment Level 3: parsing place-self with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-self">
+<meta name="assert" content="place-self supports the full grammar '<align-self> <justify-self>?'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("place-self", "auto auto", "auto");
+test_valid_value("place-self", "normal");
+test_valid_value("place-self", "stretch");
+
+test_valid_value("place-self", "first baseline", "baseline");
+test_valid_value("place-self", "last baseline last baseline", "last baseline");
+
+test_valid_value("place-self", "center center", "center");
+test_valid_value("place-self", "start");
+test_valid_value("place-self", "self-start");
+test_valid_value("place-self", "flex-end");
+test_valid_value("place-self", "unsafe center");
+test_valid_value("place-self", "safe self-end safe self-end", "safe self-end");
+
+test_valid_value("place-self", "auto last baseline");
+test_valid_value("place-self", "baseline flex-end");
+test_valid_value("place-self", "unsafe center stretch");
+
+test_valid_value("place-self", "normal right");
+test_valid_value("place-self", "baseline unsafe left");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-remove.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-remove.tentative.window.js
rename to third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.js
rename to third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.js
rename to third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemWriter.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemWriter.tentative.https.window.js
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/native-file-system/FileSystemWriter.tentative.window.js
rename to third_party/blink/web_tests/external/wpt/native-file-system/FileSystemWriter.tentative.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/NativeFileSystemWritableFileStream.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/NativeFileSystemWritableFileStream.tentative.https.window.js
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/native-file-system/NativeFileSystemWritableFileStream.tentative.window.js
rename to third_party/blink/web_tests/external/wpt/native-file-system/NativeFileSystemWritableFileStream.tentative.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
index 88227cb..16a859a 100644
--- a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
+++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
@@ -580,7 +580,9 @@
       this.setGripOrigin(fakeInputSourceInit.gripOrigin);
     }
 
-    this.gamepad_ = null;
+    // This properly handles if supportedButtons were not specified.
+    this.setSupportedButtons(fakeInputSourceInit.supportedButtons);
+
     this.emulated_position_ = false;
     this.desc_dirty_ = true;
   }
@@ -633,6 +635,10 @@
 
   startSelection() {
     this.primary_input_pressed_ = true;
+    if (this.gamepad_) {
+      this.gamepad_.buttons[0].pressed = true;
+      this.gamepad_.buttons[0].touched = true;
+    }
   }
 
   endSelection() {
@@ -642,12 +648,89 @@
 
     this.primary_input_pressed_ = false;
     this.primary_input_clicked_ = true;
+
+    if (this.gamepad_) {
+      this.gamepad_.buttons[0].pressed = false;
+      this.gamepad_.buttons[0].touched = false;
+    }
   }
 
   simulateSelect() {
     this.primary_input_clicked_ = true;
   }
 
+  setSupportedButtons(supportedButtons) {
+    this.gamepad_ = null;
+    this.supported_buttons_ = [];
+
+    // If there are no supported buttons, we can stop now.
+    if (supportedButtons == null || supportedButtons.length < 1) {
+      return;
+    }
+
+    let supported_button_map = {};
+    this.gamepad_ = this.getEmptyGamepad();
+    for (let i = 0; i < supportedButtons.length; i++) {
+      let buttonType = supportedButtons[i].buttonType;
+      this.supported_buttons_.push(buttonType);
+      supported_button_map[buttonType] = supportedButtons[i];
+    }
+
+    // Let's start by building the button state in order of priority:
+    // Primary button is index 0.
+    this.gamepad_.buttons.push({
+      pressed: this.primary_input_pressed_,
+      touched: this.primary_input_pressed_,
+      value: this.primary_input_pressed_ ? 1.0 : 0.0
+    });
+
+    // Now add the rest of our buttons
+    this.addGamepadButton(supported_button_map['grip']);
+    this.addGamepadButton(supported_button_map['touchpad']);
+    this.addGamepadButton(supported_button_map['thumbstick']);
+    this.addGamepadButton(supported_button_map['optional-button']);
+    this.addGamepadButton(supported_button_map['optional-thumbstick']);
+
+    // Finally, back-fill placeholder buttons/axes
+    for (let i = 0; i < this.gamepad_.buttons.length; i++) {
+      if (this.gamepad_.buttons[i] == null) {
+        this.gamepad_.buttons[i] = {
+          pressed: false,
+          touched: false,
+          value: 0
+        }
+      }
+    }
+
+    for (let i=0; i < this.gamepad_.axes.length; i++) {
+      if (this.gamepad_.axes[i] == null) {
+        this.gamepad_.axes[i] = 0;
+      }
+    }
+  }
+
+  updateButtonState(buttonState) {
+    if (this.supported_buttons_.indexOf(buttonState.buttonType) == -1) {
+      throw new Error("Tried to update state on an unsupported button");
+    }
+
+    let buttonIndex = this.getButtonIndex(buttonState.buttonType);
+    let axesStartIndex = this.getAxesStartIndex(buttonState.buttonType);
+
+    if (buttonIndex == -1) {
+      throw new Error("Unknown Button Type!");
+    }
+
+    this.gamepad_.buttons[buttonIndex].pressed = buttonState.pressed;
+    this.gamepad_.buttons[buttonIndex].touched = buttonState.touched;
+    this.gamepad_.buttons[buttonIndex].value = buttonState.pressedValue;
+
+    if (axesStartIndex != -1) {
+      this.gamepad_.axes[axesStartIndex] = buttonState.xValue == null ? 0.0 : buttonState.xValue;
+      this.gamepad_.axes[axesStartIndex + 1] = buttonState.yValue == null ? 0.0 : buttonState.yValue;
+    }
+  }
+
   // Helpers for Mojom
   getInputSourceState() {
     let input_state = new device.mojom.XRInputSourceState();
@@ -696,6 +779,89 @@
 
     return input_state;
   }
+
+  getEmptyGamepad() {
+    // Mojo complains if some of the properties on Gamepad are null, so set
+    // everything to reasonable defaults that tests can override.
+    let gamepad = new device.mojom.Gamepad();
+    gamepad.connected = true;
+    gamepad.id = "";
+    gamepad.timestamp = 0;
+    gamepad.axes = [];
+    gamepad.buttons = [];
+    gamepad.mapping = "xr-standard";
+    gamepad.display_id = 0;
+
+    switch (this.handedness_) {
+      case 'left':
+      gamepad.hand = device.mojom.GamepadHand.GamepadHandLeft;
+      break;
+      case 'right':
+      gamepad.hand = device.mojom.GamepadHand.GamepadHandRight;
+      break;
+      default:
+      gamepad.hand = device.mojom.GamepadHand.GamepadHandNone;
+      break;
+    }
+
+    return gamepad;
+  }
+
+  addGamepadButton(buttonState) {
+    if (buttonState == null) {
+      return;
+    }
+
+    let buttonIndex = this.getButtonIndex(buttonState.buttonType);
+    let axesStartIndex = this.getAxesStartIndex(buttonState.buttonType);
+
+    if (buttonIndex == -1) {
+      throw new Error("Unknown Button Type!");
+    }
+
+    this.gamepad_.buttons[buttonIndex] = {
+      pressed: buttonState.pressed,
+      touched: buttonState.touched,
+      value: buttonState.pressedValue
+    };
+
+    // Add x/y value if supported.
+    if (axesStartIndex != -1) {
+      this.gamepad_.axes[axesStartIndex] = (buttonState.xValue == null ? 0.0 : buttonSate.xValue);
+      this.gamepad_.axes[axesStartIndex + 1] = (buttonState.yValue == null ? 0.0 : buttonSate.yValue);
+    }
+  }
+
+  // General Helper methods
+  getButtonIndex(buttonType) {
+    switch (buttonType) {
+      case 'grip':
+        return 1;
+      case 'touchpad':
+        return 2;
+      case 'thumbstick':
+        return 3;
+      case 'optional-button':
+        return 4;
+      case 'optional-thumbstick':
+        return 5;
+      default:
+        return -1;
+    }
+  }
+
+  getAxesStartIndex(buttonType) {
+    switch (buttonType) {
+      case 'touchpad':
+        return 0;
+      case 'thumbstick':
+        return 2;
+      case 'optional-thumbstick':
+        return 4;
+      default:
+        return -1;
+    }
+  }
 }
 
 // Mojo helper classes
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
index 3c277a5..31ae799 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
@@ -48,18 +48,18 @@
                                            **kwargs)
     executor_kwargs["close_after_done"] = True
     capabilities = dict(DesiredCapabilities.CHROME.items())
-    capabilities["chromeOptions"] = {}
-    # required to start on mobile
-    capabilities["chromeOptions"]["androidPackage"] = "com.google.android.apps.chrome"
+    capabilities["goog:chromeOptions"] = {}
+    # TODO(chrome): browser_channel should be properly supported.
+    package_name = "com.android.chrome"  # stable channel
+    # Required to start on mobile
+    capabilities["goog:chromeOptions"]["androidPackage"] = package_name
 
     for (kwarg, capability) in [("binary", "binary"), ("binary_args", "args")]:
         if kwargs[kwarg] is not None:
-            capabilities["chromeOptions"][capability] = kwargs[kwarg]
+            capabilities["goog:chromeOptions"][capability] = kwargs[kwarg]
     if test_type == "testharness":
         capabilities["useAutomationExtension"] = False
         capabilities["excludeSwitches"] = ["enable-automation"]
-    if test_type == "wdspec":
-        capabilities["chromeOptions"]["w3c"] = True
     executor_kwargs["capabilities"] = capabilities
     return executor_kwargs
 
@@ -86,15 +86,17 @@
         self.server = ChromeDriverServer(self.logger,
                                          binary=webdriver_binary,
                                          args=webdriver_args)
+        self.setup_adb_reverse()
 
     def _adb_run(self, args):
         self.logger.info('adb ' + ' '.join(args))
         subprocess.check_call(['adb'] + args)
 
-    def setup(self):
+    def setup_adb_reverse(self):
         self._adb_run(['wait-for-device'])
         self._adb_run(['forward', '--remove-all'])
         self._adb_run(['reverse', '--remove-all'])
+        # "adb reverse" forwards network connection from device to host.
         for port in _wptserve_ports:
             self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port])
 
diff --git a/third_party/blink/web_tests/external/wpt/wake-lock/wakelock-abortsignal.https.any.js b/third_party/blink/web_tests/external/wpt/wake-lock/wakelock-abortsignal.https.any.js
index 7961674..671852f 100644
--- a/third_party/blink/web_tests/external/wpt/wake-lock/wakelock-abortsignal.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/wake-lock/wakelock-abortsignal.https.any.js
@@ -14,7 +14,7 @@
   ];
 
   for (let signal of invalidSignals) {
-    await promise_rejects(t, new TypeError(), WakeLock.request('screen', { signal: signal }));
+    await promise_rejects(t, new TypeError(), WakeLock.request('system', { signal: signal }));
   }
 }, "'TypeError' is thrown when the signal option is not an AbortSignal");
 
@@ -24,7 +24,7 @@
   abortController.abort();
   assert_true(abortSignal.aborted);
 
-  return promise_rejects(t, "AbortError", WakeLock.request('screen', { signal: abortSignal }));
+  return promise_rejects(t, "AbortError", WakeLock.request('system', { signal: abortSignal }));
 }, "A WakeLock request with an AbortSignal whose abort flag is set always aborts");
 
 promise_test(async t => {
@@ -33,8 +33,8 @@
   abortController.abort();
   assert_true(abortSignal.aborted);
 
-  const lock1 = WakeLock.request('screen', { signal: abortSignal });
-  const lock2 = WakeLock.request('screen', { signal: abortSignal });
+  const lock1 = WakeLock.request('system', { signal: abortSignal });
+  const lock2 = WakeLock.request('system', { signal: abortSignal });
   const lock3 = WakeLock.request('system', { signal: abortSignal });
 
   await promise_rejects(t, "AbortError", lock1);
diff --git a/third_party/blink/web_tests/xr/events_input_source_recreation.html b/third_party/blink/web_tests/external/wpt/webxr/events_input_source_recreation.https.html
similarity index 81%
rename from third_party/blink/web_tests/xr/events_input_source_recreation.html
rename to third_party/blink/web_tests/external/wpt/webxr/events_input_source_recreation.https.html
index 347c9bb..ab78d9d8 100644
--- a/third_party/blink/web_tests/xr/events_input_source_recreation.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_input_source_recreation.https.html
@@ -1,11 +1,8 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
@@ -15,9 +12,7 @@
 
 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
 
-let requestSessionModes = ['immersive-vr'];
-
-let testFunction = function(session, t, fakeDeviceController) {
+let testFunction = function(session, fakeDeviceController, t) {
   let eventWatcher = new EventWatcher(t, session, ["watcherdone"]);
   let eventPromise = eventWatcher.wait_for(["watcherdone"]);
 
@@ -94,9 +89,6 @@
 
   session.addEventListener('inputsourceschange', onInputSourcesChange, false);
 
-  // Session must have a baseLayer or frame requests will be ignored.
-  session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
   // Create a gaze based input source with no handedness that we can change
   // to validate SameObject properties.
   let input_source = fakeDeviceController.simulateInputSourceConnection({
@@ -121,5 +113,5 @@
 };
 
 xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 </script>
diff --git a/third_party/blink/web_tests/xr/events_input_sources_change.html b/third_party/blink/web_tests/external/wpt/webxr/events_input_sources_change.https.html
similarity index 78%
rename from third_party/blink/web_tests/xr/events_input_sources_change.html
rename to third_party/blink/web_tests/external/wpt/webxr/events_input_sources_change.https.html
index e2bbedc1..bc2b2a9 100644
--- a/third_party/blink/web_tests/xr/events_input_sources_change.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_input_sources_change.https.html
@@ -1,11 +1,8 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
@@ -15,9 +12,7 @@
 
 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
 
-let requestSessionModes = ['immersive-vr'];
-
-let testFunction = function(session, t, fakeDeviceController) {
+let testFunction = function(session, fakeDeviceController, t) {
   let eventWatcher = new EventWatcher(
     t, session, ["inputsourceschange", "selectstart", "select", "selectend", "watcherdone"]);
   let eventPromise = eventWatcher.wait_for(
@@ -76,9 +71,6 @@
 
   session.addEventListener('inputsourceschange', onInputSourcesChange, false);
 
-  // Session must have a baseLayer or frame requests will be ignored.
-  session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
   // Create our input source and immediately toggle the primary input so that
   // it appears as already needing to send a click event when it appears.
   let input_source = fakeDeviceController.simulateInputSourceConnection({
@@ -100,5 +92,5 @@
 };
 
 xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 </script>
diff --git a/third_party/blink/web_tests/xr/events_session_select.html b/third_party/blink/web_tests/external/wpt/webxr/events_session_select.https.html
similarity index 77%
rename from third_party/blink/web_tests/xr/events_session_select.html
rename to third_party/blink/web_tests/external/wpt/webxr/events_session_select.https.html
index 688ff6e..b74d5ea 100644
--- a/third_party/blink/web_tests/xr/events_session_select.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_session_select.https.html
@@ -1,11 +1,8 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
@@ -16,11 +13,9 @@
 
 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
 
-let requestSessionModes = ['immersive-vr'];
-
 let xrViewerSpace = null;
 
-let testFunction = function(session, t, fakeDeviceController) {
+let testFunction = function(session, fakeDeviceController, t) {
   let eventWatcher = new EventWatcher(
     t, session, ["selectstart", "select", "selectend", "watcherdone"]);
   let eventPromise = eventWatcher.wait_for(
@@ -70,9 +65,6 @@
   session.addEventListener("selectend", onSessionSelectEnd, false);
   session.addEventListener("select", onSessionSelect, false);
 
-  // Session must have a baseLayer or frame requests will be ignored.
-  session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
   let input_source =
     fakeDeviceController.simulateInputSourceConnection(VALID_CONTROLLER);
   let currentReferenceSpace = null;
@@ -102,6 +94,6 @@
 };
 
 xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 
 </script>
diff --git a/third_party/blink/web_tests/xr/events_session_select_subframe.html b/third_party/blink/web_tests/external/wpt/webxr/events_session_select_subframe.https.html
similarity index 69%
rename from third_party/blink/web_tests/xr/events_session_select_subframe.html
rename to third_party/blink/web_tests/external/wpt/webxr/events_session_select_subframe.https.html
index 395b962..0e2c2342 100644
--- a/third_party/blink/web_tests/xr/events_session_select_subframe.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_session_select_subframe.https.html
@@ -1,11 +1,8 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
@@ -17,9 +14,7 @@
 
 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
 
-let requestSessionModes = ['immersive-vr'];
-
-let testFunction = function(session, t, fakeDeviceController) {
+let testFunction = function(session, fakeDeviceController, t) {
   let eventWatcher = new EventWatcher(
     t, session, ["selectstart", "selectend", "select", "watcherdone"]);
   let eventPromise = eventWatcher.wait_for(
@@ -53,9 +48,6 @@
   session.addEventListener("selectend", onSessionSelectEnd, false);
   session.addEventListener("select", onSessionSelect, false);
 
-  // Session must have a baseLayer or frame requests will be ignored.
-  session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
   let input_source = fakeDeviceController.simulateInputSourceConnection(VALID_CONTROLLER);
 
   // Press the primary input button and then release it a short time later.
@@ -69,6 +61,6 @@
 };
 
 xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 
 </script>
diff --git a/third_party/blink/web_tests/xr/getInputPose_handedness.html b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html
similarity index 70%
rename from third_party/blink/web_tests/xr/getInputPose_handedness.html
rename to third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html
index ecf462f..5a310c6 100644
--- a/third_party/blink/web_tests/xr/getInputPose_handedness.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html
@@ -1,11 +1,8 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
@@ -14,13 +11,8 @@
 
 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
 
-let requestSessionModes =  ['immersive-vr'];
-
 let testFunction =
-  (session, t, fakeDeviceController) => new Promise((resolve) => {
-    // Session must have a baseLayer or frame requests will be ignored.
-    session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
+  (session, fakeDeviceController, t) => new Promise((resolve) => {
     let input_source = fakeDeviceController.simulateInputSourceConnection({
       handedness: "none",
       targetRayMode: "tracked-pointer",
@@ -87,6 +79,6 @@
   });
 
 xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 
 </script>
diff --git a/third_party/blink/web_tests/xr/getInputPose_hand.html b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_pointer.https.html
similarity index 71%
rename from third_party/blink/web_tests/xr/getInputPose_hand.html
rename to third_party/blink/web_tests/external/wpt/webxr/getInputPose_pointer.https.html
index d257638..c8545999 100644
--- a/third_party/blink/web_tests/xr/getInputPose_hand.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_pointer.https.html
@@ -1,11 +1,9 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
@@ -15,14 +13,8 @@
 
 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
 
-let requestSessionModes =  ['immersive-vr'];
-
 let testFunction =
-  (session, t, fakeDeviceController) => new Promise((resolve) => {
-    // Session must have a baseLayer or frame requests will be ignored.
-    session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
-
+  (session, fakeDeviceController, t) => new Promise((resolve) => {
     let input_source = fakeDeviceController.simulateInputSourceConnection({
       handedness: "right",
       targetRayMode: "tracked-pointer",
@@ -62,9 +54,9 @@
           // When a grip matrix is present but no pointer offset is specified,
           // the grip and pointer matrices should be the same.
           assert_not_equals(grip_pose, null);
-          assert_matrices_approx_equal(grip_pose.transform.matrix, VALID_GRIP,
+          assert_matrix_approx_equals(grip_pose.transform.matrix, VALID_GRIP,
             FLOAT_EPSILON, "Grip matrix is not equal to input.");
-          assert_matrices_approx_equal(input_pose.transform.matrix,
+          assert_matrix_approx_equals(input_pose.transform.matrix,
             grip_pose.transform.matrix, FLOAT_EPSILON,
             "Grip matrix is not equal to target ray matrix.");
         });
@@ -85,9 +77,9 @@
           // pointer matrix should be grip matrix multiplied with the pointer
           // offset.
           assert_not_equals(grip_pose, null);
-          assert_matrices_approx_equal(grip_pose.transform.matrix, VALID_GRIP,
+          assert_matrix_approx_equals(grip_pose.transform.matrix, VALID_GRIP,
             FLOAT_EPSILON, "Grip matrix is not equal to input valid grip.");
-          assert_matrices_approx_equal(input_pose.transform.matrix,
+          assert_matrix_approx_equals(input_pose.transform.matrix,
             VALID_GRIP_WITH_POINTER_OFFSET, FLOAT_EPSILON,
             "Grip matrix not multipled properly.");
         });
@@ -101,6 +93,6 @@
   });
 
 xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_asserts.js b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_asserts.js
index 2253ffc..36524211 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_asserts.js
+++ b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_asserts.js
@@ -1,10 +1,11 @@
 // Utility assert functions.
 // Relies on resources/testharness.js to be included before this file.
+// Relies on webxr_test_constants.js to be included before this file.
 
 // |p1|, |p2| - objects with x, y, z, w components that are floating point numbers
 // |epsilon| - float specifying precision
 // |prefix| - string used as a prefix for logging
-let assert_point_approx_equals = function(p1, p2, epsilon, prefix = "") {
+let assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") {
   assert_approx_equals(p1.x, p2.x, epsilon, prefix + "xs must match");
   assert_approx_equals(p1.y, p2.y, epsilon, prefix + "ys must match");
   assert_approx_equals(p1.z, p2.z, epsilon, prefix + "zs must match");
@@ -14,7 +15,7 @@
 // |m1|, |m2| - arrays of floating point numbers
 // |epsilon| - float specifying precision
 // |prefix| - string used as a prefix for logging
-let assert_matrix_approx_equals = function(m1, m2, epsilon, prefix = "") {
+let assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") {
   assert_equals(m1.length, m2.length, prefix + "Matrix lengths should match");
   for(var i = 0; i < m1.length; ++i) {
     assert_approx_equals(m1[i], m2[i], epsilon, prefix + "Component number " + i + " should match");
@@ -24,7 +25,7 @@
 // |r1|, |r2| - XRRay objects
 // |epsilon| - float specifying precision
 // |prefix| - string used as a prefix for logging
-let assert_ray_approx_equals = function(r1, r2, epsilon, prefix = "") {
+let assert_ray_approx_equals = function(r1, r2, epsilon = FLOAT_EPSILON, prefix = "") {
   assert_point_approx_equals(r1.origin, r2.origin, epsilon, prefix + "origin:");
   assert_point_approx_equals(r1.direction, r2.direction, epsilon, prefix + "direction:");
   assert_matrix_approx_equals(r1.matrix, r2.matrix, epsilon, prefix + "matrix:");
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js
index fd6d0fb1..a0b0e27 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js
+++ b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js
@@ -50,8 +50,10 @@
     orientation: [0, 0, 0, 1]
 };
 
-const VALID_GRIP_WITH_POINTER_OFFSET =
-    [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 4, 3, 3, 1];
+const VALID_GRIP_WITH_POINTER_OFFSET = [1, 0, 0, 0,
+                                        0, 1, 0, 0,
+                                        0, 0, 1, 0,
+                                        4, 3, 3, 1];
 
 // A Valid Local to floor matrix/transform for when we don't care about specific
 // values.  Note that these should be identical, just different representations.
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js
index 54a91c8..3a6a6c9 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js
+++ b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js
@@ -121,7 +121,7 @@
    '/gen/mojo/public/mojom/base/time.mojom.js',
    '/gen/gpu/ipc/common/mailbox_holder.mojom.js',
    '/gen/gpu/ipc/common/sync_token.mojom.js',
-   '/gen/ui/display/mojo/display.mojom.js',
+   '/gen/ui/display/mojom/display.mojom.js',
    '/gen/ui/gfx/geometry/mojo/geometry.mojom.js',
    '/gen/ui/gfx/mojo/gpu_fence_handle.mojom.js',
    '/gen/ui/gfx/mojo/transform.mojom.js',
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/xr-test-asserts.js b/third_party/blink/web_tests/external/wpt/webxr/resources/xr-test-asserts.js
deleted file mode 100644
index 2253ffc..0000000
--- a/third_party/blink/web_tests/external/wpt/webxr/resources/xr-test-asserts.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Utility assert functions.
-// Relies on resources/testharness.js to be included before this file.
-
-// |p1|, |p2| - objects with x, y, z, w components that are floating point numbers
-// |epsilon| - float specifying precision
-// |prefix| - string used as a prefix for logging
-let assert_point_approx_equals = function(p1, p2, epsilon, prefix = "") {
-  assert_approx_equals(p1.x, p2.x, epsilon, prefix + "xs must match");
-  assert_approx_equals(p1.y, p2.y, epsilon, prefix + "ys must match");
-  assert_approx_equals(p1.z, p2.z, epsilon, prefix + "zs must match");
-  assert_approx_equals(p1.w, p2.w, epsilon, prefix + "ws must match");
-};
-
-// |m1|, |m2| - arrays of floating point numbers
-// |epsilon| - float specifying precision
-// |prefix| - string used as a prefix for logging
-let assert_matrix_approx_equals = function(m1, m2, epsilon, prefix = "") {
-  assert_equals(m1.length, m2.length, prefix + "Matrix lengths should match");
-  for(var i = 0; i < m1.length; ++i) {
-    assert_approx_equals(m1[i], m2[i], epsilon, prefix + "Component number " + i + " should match");
-  }
-}
-
-// |r1|, |r2| - XRRay objects
-// |epsilon| - float specifying precision
-// |prefix| - string used as a prefix for logging
-let assert_ray_approx_equals = function(r1, r2, epsilon, prefix = "") {
-  assert_point_approx_equals(r1.origin, r2.origin, epsilon, prefix + "origin:");
-  assert_point_approx_equals(r1.direction, r2.direction, epsilon, prefix + "direction:");
-  assert_matrix_approx_equals(r1.matrix, r2.matrix, epsilon, prefix + "matrix:");
-}
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html
index e2920b1..2f84d64 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html
@@ -3,7 +3,7 @@
 <script src=/resources/testharnessreport.js></script>
 <script src="resources/webxr_util.js"></script>
 <script src="resources/webxr_test_constants.js"></script>
-<script src="resources/xr-test-asserts.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
 <canvas></canvas>
 
 <script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html
index 50e8abf1..2c79126 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html
@@ -3,7 +3,7 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="resources/webxr_test_constants.js"></script>
 <script src="resources/webxr_util.js"></script>
-<script src="resources/xr-test-asserts.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
 <canvas></canvas>
 
 <script>
diff --git a/third_party/blink/web_tests/xr/xrInputSource_add_remove.html b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html
similarity index 68%
rename from third_party/blink/web_tests/xr/xrInputSource_add_remove.html
rename to third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html
index 51a9b5c8..4c50670 100644
--- a/third_party/blink/web_tests/xr/xrInputSource_add_remove.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html
@@ -1,11 +1,8 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
@@ -15,12 +12,7 @@
 
 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
 
-let requestSessionModes = ['immersive-vr'];
-
-let testFunction = (session, t, fakeDeviceController) => new Promise((resolve) => {
-    // Session must have a baseLayer or frame requests will be ignored.
-    session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
+let testFunction = (session, fakeDeviceController, t) => new Promise((resolve) => {
     let input_sources = session.inputSources;
 
     t.step( () => {
@@ -72,6 +64,6 @@
   });
 
 xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 
 </script>
diff --git a/third_party/blink/web_tests/xr/xrInputSource_gamepad_disconnect.html b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_disconnect.https.html
similarity index 80%
rename from third_party/blink/web_tests/xr/xrInputSource_gamepad_disconnect.html
rename to third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_disconnect.https.html
index fd22ecb1..a43bdaa 100644
--- a/third_party/blink/web_tests/xr/xrInputSource_gamepad_disconnect.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_disconnect.https.html
@@ -1,12 +1,8 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-internal-device-mocking.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
@@ -16,9 +12,7 @@
 
 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
 
-let requestSessionModes = ['immersive-vr'];
-
-let testFunction = function(session, t, fakeDeviceController) {
+let testFunction = function(session, fakeDeviceController, t) {
   let eventWatcher = new EventWatcher(t, session, ["watcherdone"]);
   let eventPromise = eventWatcher.wait_for(["watcherdone"]);
 
@@ -96,13 +90,30 @@
 
   session.addEventListener('inputsourceschange', onInputSourcesChange, false);
 
-  // Session must have a baseLayer or frame requests will be ignored.
-  session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
+  // A set of supported buttons which should cause the runtime to treat the
+  // controller as supporting a gamepad.
+  let gamepadButtons = [
+    {
+      buttonType: 'grip',
+      pressed: false,
+      touched: false,
+      pressedValue: 0
+    },
+    {
+      buttonType: 'touchpad',
+      pressed: false,
+      touched: false,
+      pressedValue: 0
+    }
+  ];
 
-  // Create our input source and immediately toggle the primary input so that
-  // it appears as already needing to send a click event when it appears.
-  let input_source = fakeDeviceController.simulateInputSourceConnection(RIGHT_CONTROLLER);
-  input_source.connectGamepad();
+  let input_source = fakeDeviceController.simulateInputSourceConnection({
+    handedness: "right",
+    targetRayMode: "tracked-pointer",
+    pointerOrigin: VALID_POINTER_TRANSFORM,
+    profiles: [],
+    supportedButtons: gamepadButtons
+  });
 
   // Input events need one frame to propagate, so this does (in order and running
   // a rAF after each step:
@@ -114,9 +125,9 @@
   // session, at which point the controller should be disconnected.
   return new Promise((resolve) => {
     session.requestAnimationFrame(() => {
-      input_source.disconnectGamepad();
+      input_source.setSupportedButtons([]);
       session.requestAnimationFrame(() => {
-        input_source.connectGamepad();
+        input_source.setSupportedButtons(gamepadButtons);
         session.requestAnimationFrame(() => {
           input_source.disconnect();
           session.requestAnimationFrame(() => {
@@ -137,5 +148,5 @@
 };
 
 xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_input_registered.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_input_registered.https.html
new file mode 100644
index 0000000..f3e0c75a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_input_registered.https.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+<canvas id="webgl-canvas"></canvas>
+
+<script>
+let testName = "WebXR InputSource's gamepad properly registers input";
+
+let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
+
+let testFunction = function(session, fakeDeviceController, t) {
+
+  // There should only be one input source change event, which is from adding
+  // the input source at the start of the test.
+  let inputChangeEvents = 0;
+  function onInputSourcesChange(event) {
+    assert_equals(inputChangeEvents, 0,
+      "Gamepad button or input axis value changes should not fire an input source change event.");
+    inputChangeEvents++;
+  }
+
+  session.addEventListener('inputsourceschange', onInputSourcesChange, false);
+
+  // Create our input source and immediately toggle the primary input so that
+  // it appears as already needing to send a click event when it appears.
+  let input_source = fakeDeviceController.simulateInputSourceConnection({
+    handedness: "right",
+    targetRayMode: "tracked-pointer",
+    pointerOrigin: VALID_POINTER_TRANSFORM,
+    profiles: [],
+    supportedButtons: [
+      {
+        buttonType: 'grip',
+        pressed: false,
+        touched: false,
+        pressedValue: 0
+      },
+      {
+        buttonType: 'touchpad',
+        pressed: false,
+        touched: false,
+        pressedValue: 0
+      }
+    ]
+  });
+
+  let cached_input_source = null;
+  let cached_gamepad = null;
+
+  function assertSameObjects() {
+    assert_equals(session.inputSources[0], cached_input_source);
+    assert_equals(cached_input_source.gamepad, cached_gamepad);
+  }
+
+  // Input events and gamepad state changes (button presses, axis movements)
+  // need one frame to propagate, so this does (in order and running a rAF after
+  // each step):
+  // 1) Press the mock gamepad's button (so we can verify the button press makes
+  //    its way to the WebXR gamepad and that it does not fire an
+  //    inputsourceschange event).
+  // 2) Update the mock gamepad's input axes values (so we can verify the
+  //    updated values make their way to the WebXR gamepad and that it does not
+  //    fire an inputsourceschange event).
+  return new Promise((resolve) => {
+    session.requestAnimationFrame(() => {
+      // Make sure the exposed gamepad has the number of buttons and axes we
+      // requested.
+      // 3 Buttons: trigger, grip, touchpad
+      // 2 Axes from the touchpad
+      cached_input_source = session.inputSources[0];
+      cached_gamepad = cached_input_source.gamepad;
+      t.step(() => {
+        assert_equals(cached_gamepad.buttons.length, 3);
+        assert_equals(cached_gamepad.axes.length, 2);
+        // Initially, the button should not be pressed and the axes values should
+        // be set to 0.
+        assert_false(cached_gamepad.buttons[1].pressed);
+        assert_equals(cached_gamepad.axes[0], 0);
+        assert_equals(cached_gamepad.axes[1], 0);
+      }, "Verify initial state");
+      // Simulate button press.
+      input_source.updateButtonState({
+        buttonType: 'grip',
+        pressed: true,
+        touched: true,
+        value: 1.0
+      });
+      session.requestAnimationFrame(() => {
+        t.step(() => {
+          assertSameObjects();
+          assert_true(cached_gamepad.buttons[1].pressed);
+        }, "Gamepad is updated in place when a button is pressed");
+
+        // Simulate input axes movement.
+        input_source.updateButtonState({
+          buttonType: 'touchpad',
+          pressed: false,
+          touched: true,
+          value: 0,
+          xValue: 0.5,
+          yValue: -0.5
+        });
+        session.requestAnimationFrame(() => {
+          // Input source and gamepad should not be re-created. They should be
+          // updated in place when input axes values change.
+          t.step(() => {
+            assertSameObjects();
+            assert_equals(cached_gamepad.axes[0], 0.5);
+            assert_equals(cached_gamepad.axes[1], -0.5);
+            // Button that was pressed last frame should still be pressed.
+            assert_true(cached_gamepad.buttons[1].pressed);
+          }, "Gamepad is updated in place when axes values change");
+          resolve();
+        });
+      });
+    });
+  });
+};
+
+xr_session_promise_test(
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
+</script>
diff --git a/third_party/blink/web_tests/xr/xrReferenceSpace_originOffset.html b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset.https.html
similarity index 77%
rename from third_party/blink/web_tests/xr/xrReferenceSpace_originOffset.html
rename to third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset.https.html
index ef82377..b4e1c8e 100644
--- a/third_party/blink/web_tests/xr/xrReferenceSpace_originOffset.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset.https.html
@@ -1,17 +1,12 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
-
-// Can't go in external WPT tests because this test uses MockXRInputSource which
-// is not available there.
 let testName = "Updating XRReferenceSpace origin offset updates view and input matrices.";
 
 const VIEW_OFFSET_WITH_ROTATION = {
@@ -37,13 +32,8 @@
   views: VIEWS_WITH_OFFSET
 };
 
-let requestSessionModes =  ['immersive-vr'];
-
 let testFunction =
-  (session, t, fakeDeviceController) => new Promise((resolve) => {
-    // Session must have a baseLayer or frame requests will be ignored.
-    session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
+  (session, fakeDeviceController, t) => new Promise((resolve) => {
     const GRIP_TRANSFORM_WITH_ROTATION = {
       position: [1, 2, 3],
       orientation: [0, 0.7071, 0, 0.7071]
@@ -91,9 +81,9 @@
             let grip_matrix = grip_pose.transform.matrix;
             let ray_matrix = input_pose.transform.matrix;
 
-            assert_matrices_approx_equal(view_matrix, expected_view_matrix);
-            assert_matrices_approx_equal(grip_matrix, expected_grip_matrix);
-            assert_matrices_approx_equal(ray_matrix, expected_ray_matrix);
+            assert_matrix_approx_equals(view_matrix, expected_view_matrix);
+            assert_matrix_approx_equals(grip_matrix, expected_grip_matrix);
+            assert_matrix_approx_equals(ray_matrix, expected_ray_matrix);
           });
         }
 
@@ -138,6 +128,6 @@
   });
 
 xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 
 </script>
diff --git a/third_party/blink/web_tests/xr/xrReferenceSpace_originOffsetBounded.html b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html
similarity index 83%
rename from third_party/blink/web_tests/xr/xrReferenceSpace_originOffsetBounded.html
rename to third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html
index 0c477cb..f76c3c4 100644
--- a/third_party/blink/web_tests/xr/xrReferenceSpace_originOffsetBounded.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html
@@ -1,17 +1,13 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
 
-// Can't go in external WPT tests because this test uses MockXRInputSource which
-// is not available there.
 const testName = "Updating XRBoundedReferenceSpace origin offset updates view, input matrices, and bounds geometry.";
 
 const INITIAL_VIEW_OFFSET = {
@@ -49,12 +45,7 @@
   ]
 };
 
-const requestSessionModes = ['immersive-vr'];
-
-function testFunction(session, t, fakeDeviceController) {
-  // Session must have a baseLayer or frame requests will be ignored.
-  session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
+function testFunction(session, fakeDeviceController, t) {
   const INITIAL_GRIP_TRANSFORM = {
     position: [1, 2, 3],
     orientation: [0, 0, 0, 1]
@@ -94,13 +85,13 @@
             let grip_matrix = grip_pose.transform.matrix;
             let ray_matrix = input_pose.transform.matrix;
 
-            assert_matrices_approx_equal(expected_view_matrix, view_matrix);
-            assert_matrices_approx_equal(expected_grip_matrix, grip_matrix);
-            assert_matrices_approx_equal(expected_ray_matrix, ray_matrix);
+            assert_matrix_approx_equals(expected_view_matrix, view_matrix);
+            assert_matrix_approx_equals(expected_grip_matrix, grip_matrix);
+            assert_matrix_approx_equals(expected_ray_matrix, ray_matrix);
 
             assert_equals(reference_space.boundsGeometry.length, expected_bounds_geometry.length);
             for (var i = 0; i < reference_space.boundsGeometry.length; ++i) {
-              assert_points_approx_equal(reference_space.boundsGeometry[i], expected_bounds_geometry[i]);
+              assert_point_approx_equals(reference_space.boundsGeometry[i], expected_bounds_geometry[i]);
             }
           });
         }
@@ -246,6 +237,7 @@
   });
 };
 
-xr_session_promise_test(testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+xr_session_promise_test(
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 
 </script>
diff --git a/third_party/blink/web_tests/xr/xrSession_input_events_end.html b/third_party/blink/web_tests/external/wpt/webxr/xrSession_input_events_end.https.html
similarity index 72%
rename from third_party/blink/web_tests/xr/xrSession_input_events_end.html
rename to third_party/blink/web_tests/external/wpt/webxr/xrSession_input_events_end.https.html
index 31d0593..37e0206 100644
--- a/third_party/blink/web_tests/xr/xrSession_input_events_end.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_input_events_end.https.html
@@ -1,11 +1,8 @@
 <!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
 <canvas id="webgl-canvas"></canvas>
 
 <script>
@@ -13,11 +10,9 @@
 
 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
 
-let requestSessionModes = ['immersive-vr'];
-
 function requestImmersiveSession() {
   return new Promise((resolve, reject) => {
-    runWithUserGesture(() => {
+    navigator.xr.test.simulateUserActivation(() => {
       navigator.xr.requestSession('immersive-vr').then((session) => {
         resolve(session);
       }, (err) => {
@@ -27,7 +22,7 @@
   });
 }
 
-let testFunction = function(session, t, fakeDeviceController) {
+let testFunction = function(session, fakeDeviceController, t) {
 
   // helper method to send a click and then request a dummy animation frame to
   // ensure that the click propagates.  We're doing everything in these tests
@@ -50,9 +45,6 @@
         ["inputsourceschange", "selectstart", "select", "selectend", "end"]);
       let eventPromise = eventWatcher.wait_for(eventOrder);
 
-      // Session must have a baseLayer or frame requests will be ignored.
-      session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
       session.addEventListener(endEvent, ()=> {
         session.end();
       }, false);
@@ -77,6 +69,6 @@
 };
 
 xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
 
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html
index f858779..bdb5edd 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html
@@ -4,7 +4,7 @@
   <script src=/resources/testharnessreport.js></script>
   <script src="resources/webxr_util.js"></script>
   <script src="resources/webxr_test_constants.js"></script>
-  <script src="resources/xr-test-asserts.js"></script>
+  <script src="resources/webxr_test_asserts.js"></script>
   <canvas></canvas>
 
   <script>
@@ -54,7 +54,7 @@
 
                 let poseMatrix = pose.transform.matrix;
                 assert_not_equals(poseMatrix, null);
-                assert_matrix_approx_equals(poseMatrix, expectedPoseMatrix, FLOAT_EPSILON);
+                assert_matrix_approx_equals(poseMatrix, expectedPoseMatrix);
               });
 
               // Finished.
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html
index 06a2566..aa3c1b8 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html
@@ -3,7 +3,7 @@
 <script src=/resources/testharnessreport.js></script>
 <script src="resources/webxr_util.js"></script>
 <script src="resources/webxr_test_constants.js"></script>
-<script src="resources/xr-test-asserts.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
 <canvas></canvas>
 
 <script>
@@ -49,7 +49,7 @@
           assert_not_equals(pose, null);
 
           let poseMatrix = pose.transform.matrix;
-          assert_matrix_approx_equals(poseMatrix, VALID_FLOOR_ORIGIN_MATRIX, FLOAT_EPSILON);
+          assert_matrix_approx_equals(poseMatrix, VALID_FLOOR_ORIGIN_MATRIX);
         });
 
         // Finished.
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html
index 4ff22ff..956edba 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html
@@ -3,7 +3,7 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="resources/webxr_test_constants.js"></script>
 <script src="resources/webxr_util.js"></script>
-<script src="resources/xr-test-asserts.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
 <canvas></canvas>
 
 <script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html
index 247e3b7..9553a44 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html
@@ -3,7 +3,7 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="resources/webxr_test_constants.js"></script>
 <script src="resources/webxr_util.js"></script>
-<script src="resources/xr-test-asserts.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
 <canvas></canvas>
 
 <script>
diff --git a/third_party/blink/web_tests/fast/alignment/parse-place-content.html b/third_party/blink/web_tests/fast/alignment/parse-place-content.html
index a2bd3fe..dda9f800 100644
--- a/third_party/blink/web_tests/fast/alignment/parse-place-content.html
+++ b/third_party/blink/web_tests/fast/alignment/parse-place-content.html
@@ -206,9 +206,9 @@
 }, "Test setting 'start safe' as incorrect value through CSS.");
 
 test(function() {
-    checkValues(placeContentBaseline, "placeContent", "place-content", "", "normal normal");
-    checkPlaceContentValues(placeContentBaseline, "", "normal", "normal");
-}, "Test setting 'baseline' as incorrect value through CSS.");
+    checkValues(placeContentBaseline, "placeContent", "place-content", "", "baseline start");
+    checkPlaceContentValues(placeContentBaseline, "", "baseline", "start");
+}, "Test setting 'baseline' as 'baseline start'.");
 
 test(function() {
     checkValues(placeContentBaselineSafe, "placeContent", "place-content", "", "normal normal");
diff --git a/third_party/blink/web_tests/fast/lists/nested-list-quirks-expected.html b/third_party/blink/web_tests/fast/lists/nested-list-quirks-expected.html
new file mode 100644
index 0000000..3ae41d08
--- /dev/null
+++ b/third_party/blink/web_tests/fast/lists/nested-list-quirks-expected.html
@@ -0,0 +1,17 @@
+<ul>
+  <li>&nbsp;
+    <ol>
+      <li>item</li>
+      <li>item</li>
+    </ol>
+  </li>
+</ul>
+
+<ol>
+  <li>&nbsp;
+    <ol>
+      <li>item</li>
+      <li>item</li>
+    </ol>
+  </li>
+</ol>
diff --git a/third_party/blink/web_tests/fast/lists/nested-list-quirks.html b/third_party/blink/web_tests/fast/lists/nested-list-quirks.html
new file mode 100644
index 0000000..bf3ca17
--- /dev/null
+++ b/third_party/blink/web_tests/fast/lists/nested-list-quirks.html
@@ -0,0 +1,17 @@
+<ul>
+  <li>
+    <ol>
+      <li>item</li>
+      <li>item</li>
+    </ol>
+  </li>
+</ul>
+
+<ol>
+  <li>
+    <ol>
+      <li>item</li>
+      <li>item</li>
+    </ol>
+  </li>
+</ol>
diff --git a/third_party/blink/web_tests/xr/getInputPose_ray.html b/third_party/blink/web_tests/xr/getInputPose_ray.html
deleted file mode 100644
index f7151db0..0000000
--- a/third_party/blink/web_tests/xr/getInputPose_ray.html
+++ /dev/null
@@ -1,104 +0,0 @@
-<!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
-<canvas id="webgl-canvas"></canvas>
-
-<script>
-
-let testName = "XRInputSources produce valid target rays";
-
-let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
-
-let requestSessionModes =  ['immersive-vr'];
-
-let testFunction =
-  (session, t, fakeDeviceController) => new Promise((resolve) => {
-    // Session must have a baseLayer or frame requests will be ignored.
-    session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
-    let input_source = fakeDeviceController.simulateInputSourceConnection({
-      handedness: "right",
-      targetRayMode: "tracked-pointer",
-      pointerOrigin: IDENTITY_TRANSFORM,
-      profiles: [],
-      gripOrigin: VALID_GRIP_TRANSFORM
-    });
-
-    // Must have a reference space to get input poses. eye-level doesn't apply
-    // any transforms to the given matrix.
-    session.requestReferenceSpace('local').then( (referenceSpace) => {
-
-      function CheckTargetRayNoOffset(time, xrFrame) {
-        let source = session.inputSources[0];
-
-        let grip_pose = xrFrame.getPose(source.gripSpace, referenceSpace);
-        assert_not_equals(grip_pose, null);
-
-        let input_pose = xrFrame.getPose(source.targetRaySpace, referenceSpace);
-        assert_not_equals(input_pose, null);
-        let targetRay = new XRRay(input_pose.transform);
-
-        t.step( () => {
-          assert_matrices_approx_equal(targetRay.matrix,
-            grip_pose.transform.matrix, FLOAT_EPSILON,
-            "Target ray matrix is incorrect.");
-
-          assert_equals(targetRay.origin.x, 4.0);
-          assert_equals(targetRay.origin.y, 3.0);
-          assert_equals(targetRay.origin.z, 2.0);
-          assert_equals(targetRay.origin.w, 1.0);
-
-          assert_equals(targetRay.direction.x, 0.0);
-          assert_equals(targetRay.direction.y, 0.0);
-          assert_equals(targetRay.direction.z, -1.0);
-          assert_equals(targetRay.direction.w, 0.0);
-        }, "Target ray computed properly with no pointer offset");
-
-        input_source.setPointerOrigin(VALID_POINTER_TRANSFORM);
-
-        session.requestAnimationFrame(CheckTargetRayOffset);
-      }
-
-      function CheckTargetRayOffset(time, xrFrame) {
-        let source = session.inputSources[0];
-
-        let grip_pose = xrFrame.getPose(source.gripSpace, referenceSpace);
-        assert_not_equals(grip_pose, null);
-
-        let input_pose = xrFrame.getPose(source.targetRaySpace, referenceSpace);
-        assert_not_equals(input_pose, null);
-        let targetRay = new XRRay(input_pose.transform);
-
-        t.step( () => {
-          assert_matrices_approx_equal(targetRay.matrix,
-            VALID_GRIP_WITH_POINTER_OFFSET, FLOAT_EPSILON,
-            "Target ray matrix is not offset properly.");
-
-          assert_equals(targetRay.origin.x, 4.0);
-          assert_equals(targetRay.origin.y, 3.0);
-          assert_equals(targetRay.origin.z, 3.0);
-          assert_equals(targetRay.origin.w, 1.0);
-
-          assert_equals(targetRay.direction.x, 0.0);
-          assert_equals(targetRay.direction.y, 0.0);
-          assert_equals(targetRay.direction.z, -1.0);
-          assert_equals(targetRay.direction.w, 0.0);
-        }, "Target ray computed properly with a pointer offset");
-
-        resolve();
-      }
-
-      // Can only request input poses in an xr frame.
-      session.requestAnimationFrame(CheckTargetRayNoOffset);
-    });
-  });
-
-xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
-
-</script>
diff --git a/third_party/blink/web_tests/xr/resources/xr-internal-device-mocking.js b/third_party/blink/web_tests/xr/resources/xr-internal-device-mocking.js
index a480bc1..99313cd0 100644
--- a/third_party/blink/web_tests/xr/resources/xr-internal-device-mocking.js
+++ b/third_party/blink/web_tests/xr/resources/xr-internal-device-mocking.js
@@ -37,43 +37,3 @@
 MockRuntime.prototype.getMissingFrameCount = function() {
   return this.presentation_provider_.missing_frame_count_;
 };
-
-MockXRInputSource.prototype.connectGamepad = function() {
-  // Mojo complains if some of the properties on Gamepad are null, so set
-  // everything to reasonable defaults that tests can override.
-  this.gamepad_ = new device.mojom.Gamepad();
-  this.gamepad_.connected = true;
-  this.gamepad_.id = "unknown";
-  this.gamepad_.timestamp = 0;
-  this.gamepad_.axes = [];
-  this.gamepad_.buttons = [];
-  this.gamepad_.mapping = "";
-  this.gamepad_.display_id = 0;
-  this.gamepad_.hand = device.mojom.GamepadHand.GamepadHandNone;
-};
-
-MockXRInputSource.prototype.disconnectGamepad = function() {
-  this.gamepad_ = null;
-};
-
-MockXRInputSource.prototype.setGamepadButtonCount = function(button_count) {
-  this.gamepad_.buttons = [];
-  for (let i = 0; i < button_count; ++i) {
-    this.gamepad_.buttons.push(new device.mojom.GamepadButton());
-  }
-};
-
-MockXRInputSource.prototype.setGamepadAxesCount = function(axes_count) {
-  this.gamepad_.axes = [];
-  for (let i = 0; i < axes_count; ++i) {
-    this.gamepad_.axes.push(0);
-  }
-};
-
-MockXRInputSource.prototype.setGamepadButtonPressed = function(button_index, is_pressed) {
-  this.gamepad_.buttons[button_index].pressed = is_pressed;
-};
-
-MockXRInputSource.prototype.setGamepadAxisValue = function(index, value) {
-  this.gamepad_.axes[index] = value;
-};
diff --git a/third_party/blink/web_tests/xr/xrInputSource_gamepad_input_registered.html b/third_party/blink/web_tests/xr/xrInputSource_gamepad_input_registered.html
deleted file mode 100644
index b25675b..0000000
--- a/third_party/blink/web_tests/xr/xrInputSource_gamepad_input_registered.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
-<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
-<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
-<script src="../xr/resources/xr-internal-device-mocking.js"></script>
-<script src="../xr/resources/xr-test-utils.js"></script>
-<canvas id="webgl-canvas"></canvas>
-
-<script>
-let testName = "WebXR InputSource's gamepad properly registers input";
-
-let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
-
-let requestSessionModes = ['immersive-vr'];
-
-let testFunction = function(session, t, fakeDeviceController) {
-
-  // There should only be one input source change event, which is from adding
-  // the input source at the start of the test.
-  let inputChangeEvents = 0;
-  function onInputSourcesChange(event) {
-    assert_equals(inputChangeEvents, 0,
-      "Gamepad button or input axis value changes should not fire an input source change event.");
-    inputChangeEvents++;
-  }
-
-  session.addEventListener('inputsourceschange', onInputSourcesChange, false);
-
-  // Session must have a baseLayer or frame requests will be ignored.
-  session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
-
-  // Create our input source and immediately toggle the primary input so that
-  // it appears as already needing to send a click event when it appears.
-  let input_source = fakeDeviceController.simulateInputSourceConnection(RIGHT_CONTROLLER);
-  input_source.connectGamepad();
-  input_source.setGamepadButtonCount(1);
-  input_source.setGamepadAxesCount(2);
-
-  let cached_input_source = null;
-  let cached_gamepad = null;
-
-  function assertSameObjects() {
-    assert_equals(session.inputSources[0], cached_input_source);
-    assert_equals(cached_input_source.gamepad, cached_gamepad);
-  }
-
-  // Input events and gamepad state changes (button presses, axis movements)
-  // need one frame to propagate, so this does (in order and running a rAF after
-  // each step):
-  // 1) Press the mock gamepad's button (so we can verify the button press makes
-  //    its way to the WebXR gamepad and that it does not fire an
-  //    inputsourceschange event).
-  // 2) Update the mock gamepad's input axes values (so we can verify the
-  //    updated values make their way to the WebXR gamepad and that it does not
-  //    fire an inputsourceschange event).
-  return new Promise((resolve) => {
-    session.requestAnimationFrame(() => {
-      // Make sure the exposed gamepad has the number of buttons and axes we
-      // requested.
-      cached_input_source = session.inputSources[0];
-      cached_gamepad = cached_input_source.gamepad;
-      assert_equals(cached_gamepad.buttons.length, 1);
-      assert_equals(cached_gamepad.axes.length, 2);
-      // Initially, the button should not be pressed and the axes values should
-      // be set to 0.
-      assert_false(cached_gamepad.buttons[0].pressed);
-      assert_equals(cached_gamepad.axes[0], 0);
-      assert_equals(cached_gamepad.axes[1], 0);
-      // Simulate button press.
-      input_source.setGamepadButtonPressed(0, true);
-      session.requestAnimationFrame(() => {
-        // Input source and gamepad should not be re-created. They should be
-        // updated in place when a button is pressed.
-        assertSameObjects();
-        assert_true(cached_gamepad.buttons[0].pressed);
-        // Simulate input axes movement.
-        input_source.setGamepadAxisValue(0, 0.5);
-        input_source.setGamepadAxisValue(1, -0.5);
-        session.requestAnimationFrame(() => {
-          // Input source and gamepad should not be re-created. They should be
-          // updated in place when input axes values change.
-          assertSameObjects();
-          assert_equals(cached_gamepad.axes[0], 0.5);
-          assert_equals(cached_gamepad.axes[1], -0.5);
-          // Button that was pressed last frame should still be pressed.
-          assert_true(cached_gamepad.buttons[0].pressed);
-          resolve();
-        });
-      });
-    });
-  });
-};
-
-xr_session_promise_test(
-  testFunction, fakeDeviceInitParams, requestSessionModes, testName);
-</script>
diff --git a/third_party/devscripts/OWNERS b/third_party/devscripts/OWNERS
index 1967bf5..48b47ad0 100644
--- a/third_party/devscripts/OWNERS
+++ b/third_party/devscripts/OWNERS
@@ -1 +1,2 @@
 thestig@chromium.org
+# COMPONENT: Internals
diff --git a/third_party/grpc/METADATA b/third_party/grpc/METADATA
index 114036a..e758fbc 100644
--- a/third_party/grpc/METADATA
+++ b/third_party/grpc/METADATA
@@ -13,7 +13,7 @@
     type: GIT
     value: "https://github.com/grpc/grpc"
   }
-  version: "c007642f109a2f50b8ed3e4626880539ba55aca5"
-  last_upgrade_date { year: 2019 month: 7 day: 15 }
+  version: "74b981a6a3d9ba17f3acae1d72b9109325ef656d"
+  last_upgrade_date { year: 2019 month: 7 day: 16 }
   license_type: NOTICE
 }
diff --git a/third_party/grpc/README.chromium b/third_party/grpc/README.chromium
index 9558694..7dd35c0a 100644
--- a/third_party/grpc/README.chromium
+++ b/third_party/grpc/README.chromium
@@ -1,8 +1,8 @@
 Name: gRPC
 URL: https://github.com/grpc/grpc
 Version: 0
-Date: Jul 15, 2019
-Revision: c007642f109a2f50b8ed3e4626880539ba55aca5
+Date: Jul 16, 2019
+Revision: 74b981a6a3d9ba17f3acae1d72b9109325ef656d
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 634e4d6..6ef008f7 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -6201,6 +6201,11 @@
   <int value="1" label="Needs normalization"/>
 </enum>
 
+<enum name="BooleanNetworkIsolationKeyPresent">
+  <int value="0" label="Network Isolation Key Not Present"/>
+  <int value="1" label="Network Isolation Key Present"/>
+</enum>
+
 <enum name="BooleanNetworkQuietBeforeSwap">
   <int value="0" label="FMP OK, network not yet quiet"/>
   <int value="1" label="FMP not OK, network was already quiet"/>
@@ -23708,7 +23713,7 @@
   <int value="2779" label="V8HTMLMediaElement_Remote_AttributeGetter"/>
   <int value="2780" label="V8RemotePlayback_WatchAvailability_Method"/>
   <int value="2781" label="V8RemotePlayback_Prompt_Method"/>
-  <int value="2782" label="LayoutJankExplicitlyRequested"/>
+  <int value="2782" label="LayoutShiftExplicitlyRequested"/>
   <int value="2783" label="MediaSessionSkipAd"/>
   <int value="2784" label="AdFrameSizeIntervention"/>
   <int value="2785" label="V8UserActivation_HasBeenActive_AttributeGetter"/>
@@ -50394,6 +50399,12 @@
   <int value="101" label="IDC_CONTENT_CONTEXT_ACCESSIBILITY_LABELS"/>
   <int value="102" label="IDC_SEND_TO_MY_DEVICES"/>
   <int value="103" label="IDC_CONTENT_LINK_SEND_TAB_TO_SELF"/>
+  <int value="104" label="IDC_SEND_TAB_TO_SELF_SINGLE_TARGET"/>
+  <int value="105" label="IDC_CONTENT_LINK_SEND_TAB_TO_SELF_SINGLE_TARGET"/>
+  <int value="106"
+      label="IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE"/>
+  <int value="107"
+      label="IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES"/>
 </enum>
 
 <enum name="ReopenTabPromoStepAtDismissal">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 9c524ec3..4e0fe20 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -3386,6 +3386,9 @@
 
 <histogram name="Android.StrictMode.WebappSharedPrefs" units="ms"
     expires_after="M77">
+  <obsolete>
+    Removed from code July 2019.
+  </obsolete>
   <owner>hartmanng@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -26934,7 +26937,7 @@
 </histogram>
 
 <histogram name="DevTools.BackgroundService.ClearEvents"
-    enum="ServiceWorkerStatusCode" expires_after="M78">
+    enum="ServiceWorkerStatusCode" expires_after="M80">
   <owner>dgozman@chromium.org</owner>
   <owner>rayankans@chromium.org</owner>
   <summary>
@@ -26945,7 +26948,7 @@
 </histogram>
 
 <histogram name="DevTools.BackgroundService.GetEvents"
-    enum="ServiceWorkerStatusCode" expires_after="M78">
+    enum="ServiceWorkerStatusCode" expires_after="M80">
   <owner>dgozman@chromium.org</owner>
   <owner>rayankans@chromium.org</owner>
   <summary>
@@ -26955,7 +26958,7 @@
 </histogram>
 
 <histogram name="DevTools.BackgroundService.LogEvent"
-    enum="ServiceWorkerStatusCode" expires_after="M78">
+    enum="ServiceWorkerStatusCode" expires_after="M80">
   <owner>dgozman@chromium.org</owner>
   <owner>rayankans@chromium.org</owner>
   <summary>
@@ -26966,7 +26969,7 @@
 </histogram>
 
 <histogram name="DevTools.BackgroundService.StartRecording"
-    enum="DevToolsBackgroundService" expires_after="M78">
+    enum="DevToolsBackgroundService" expires_after="M80">
   <owner>dgozman@chromium.org</owner>
   <owner>rayankans@chromium.org</owner>
   <summary>
@@ -40666,7 +40669,7 @@
 </histogram>
 
 <histogram name="Extensions.HasPermissions_WebStoreInstall3" enum="Boolean"
-    expires_after="M77">
+    expires_after="2020-06-01">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -40694,7 +40697,7 @@
 </histogram>
 
 <histogram name="Extensions.HasPermissions_WebStoreInstallCancel3"
-    enum="Boolean" expires_after="M77">
+    enum="Boolean" expires_after="2020-06-01">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -42086,9 +42089,14 @@
 </histogram>
 
 <histogram name="Extensions.SandboxUnpackFailureReason"
-    enum="ExtensionUnpackFailureReason" expires_after="M77">
+    enum="ExtensionUnpackFailureReason" expires_after="never">
+<!-- expires-never: Monitors core extension installation flows. -->
+
+  <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
-  <summary>What caused a sandboxed extension unpack to fail?</summary>
+  <summary>
+    The reason an extension failed to unpack, recorded when a failure occurs.
+  </summary>
 </histogram>
 
 <histogram name="Extensions.SandboxUnpackFailureTime"
@@ -42455,7 +42463,10 @@
 </histogram>
 
 <histogram name="Extensions.UnpackFailureInstallCause"
-    enum="ExtensionInstallCause" expires_after="M77">
+    enum="ExtensionInstallCause">
+  <obsolete>
+    Stopped recording 2019-07.
+  </obsolete>
   <owner>extensions-core@chromium.org</owner>
   <summary>
     Count failing CRX installs, grouped by the way an extension can be
@@ -42464,16 +42475,20 @@
 </histogram>
 
 <histogram name="Extensions.UnpackFailureInstallSource"
-    enum="ExtensionLocation" expires_after="M77">
+    enum="ExtensionLocation" expires_after="2020-06-01">
+  <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
-    Count successful CRX installs, grouped by the location property in prefs.
-    installed.
+    The install source of an extension that failed to unpack correctly. Emitted
+    each time an extension fails to unpack from the CrxInstaller.
   </summary>
 </histogram>
 
 <histogram name="Extensions.UnpackSuccessInstallCause"
-    enum="ExtensionInstallCause" expires_after="M77">
+    enum="ExtensionInstallCause">
+  <obsolete>
+    Stopped recording 2019-07.
+  </obsolete>
   <owner>extensions-core@chromium.org</owner>
   <summary>
     Count successful CRX installs, grouped by the cause of the install.
@@ -42481,10 +42496,12 @@
 </histogram>
 
 <histogram name="Extensions.UnpackSuccessInstallSource"
-    enum="ExtensionLocation" expires_after="M77">
+    enum="ExtensionLocation" expires_after="2020-06-01">
+  <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
-    Count successful CRX installs, grouped by the location property in prefs.
+    The install source of an extension that succeeded in unpacking correctly.
+    Emitted each time an extension successfully unpacks from the CrxInstaller.
   </summary>
 </histogram>
 
@@ -44431,7 +44448,8 @@
 </histogram>
 
 <histogram name="FirstRun.IOSFirebaseConfigured" enum="FirebaseConfiguredState"
-    expires_after="M77">
+    expires_after="M87">
+  <owner>ghendel@chromium.org</owner>
   <owner>pkl@chromium.org</owner>
   <summary>Track whether Firebase is enabled or not at app startup.</summary>
 </histogram>
@@ -49213,7 +49231,7 @@
   </summary>
 </histogram>
 
-<histogram name="HttpCache.EntryLockWait" units="ms" expires_after="M77">
+<histogram name="HttpCache.EntryLockWait" units="ms" expires_after="M87">
   <owner>jkarlin@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -49235,6 +49253,16 @@
   </summary>
 </histogram>
 
+<histogram name="HttpCache.NetworkIsolationKeyPresent"
+    enum="BooleanNetworkIsolationKeyPresent" expires_after="2020-02-26">
+  <owner>jkarlin@chromium.org</owner>
+  <owner>shivanisha@chromium.org</owner>
+  <summary>
+    Records whether a cache request has a network isolation key set or not,
+    which is used for double-keying.
+  </summary>
+</histogram>
+
 <histogram name="HttpCache.OfflineStatus" enum="OfflineStatus"
     expires_after="2015-04-27">
   <obsolete>
@@ -49288,6 +49316,10 @@
 
 <histogram name="HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed"
     expires_after="M77">
+  <obsolete>
+    Removed in M77. One day Android results: 25.00% 1033 50.00% 4945 75.00%
+    42023 95.00% Infinity
+  </obsolete>
   <owner>jkarlin@chromium.org</owner>
   <summary>
     For each http cache transaction for which a cache entry exists but it cannot
@@ -49298,6 +49330,10 @@
 
 <histogram name="HttpCache.StaleEntry.Updated.Age" units="seconds"
     expires_after="M77">
+  <obsolete>
+    Removed in M77. One day percentiles on Android: 25.00% 16146 50.00% 101342
+    75.00% 372632 95.00% Infinity
+  </obsolete>
   <owner>jkarlin@chromium.org</owner>
   <summary>
     For each http cache transaction for which a validation attempt is made due
@@ -49308,6 +49344,10 @@
 
 <histogram name="HttpCache.StaleEntry.Updated.AgeInFreshnessPeriods" units="%"
     expires_after="M77">
+  <obsolete>
+    Removed in M77. One day percentiles on Android: 25.00% 246.3 50.00% 1353
+    75.00% 9142 95.00% 147572 99.00% Infinity
+  </obsolete>
   <owner>jkarlin@chromium.org</owner>
   <summary>
     For each http cache transaction for which a validation attempt is made due
@@ -49318,6 +49358,10 @@
 
 <histogram name="HttpCache.StaleEntry.Validated.Age" units="seconds"
     expires_after="M77">
+  <obsolete>
+    Removed in M77. One day percentiles on Android: 25.00% 10791 50.00% 70285
+    75.00% 223571 95.00% Infinity
+  </obsolete>
   <owner>jkarlin@chromium.org</owner>
   <summary>
     For each http cache transaction for which a validation attempt is made due
@@ -49328,6 +49372,10 @@
 
 <histogram name="HttpCache.StaleEntry.Validated.AgeInFreshnessPeriods"
     units="%" expires_after="M77">
+  <obsolete>
+    Removed in M77. One day percentiles on Android: 25.00% 169.5 50.00% 476.3
+    75.00% 2451 95.00% 43218 99.00% 474791 99.50% Infinity
+  </obsolete>
   <owner>jkarlin@chromium.org</owner>
   <summary>
     For each http cache transaction for which a validation attempt is made due
@@ -49338,6 +49386,9 @@
 
 <histogram name="HttpCache.TopFrameOriginPresent"
     enum="BooleanTopFrameOriginPresent" expires_after="2020-02-26">
+  <obsolete>
+    Deprecated 07/2019 and replaced by HttpCache.NetworkIsolationKeyPresent.
+  </obsolete>
   <owner>jkarlin@chromium.org</owner>
   <owner>shivanisha@chromium.org</owner>
   <summary>
@@ -60817,6 +60868,11 @@
 
 <histogram name="MemCache.WriteResult" enum="MemCacheWriteResult"
     expires_after="M77">
+  <obsolete>
+    Deprecated in M77. One day results for Android were 99.99% success, .01%
+    Exceeded Cache Size, and an even smaller fraction Exceeded Single Entry
+    Size.
+  </obsolete>
   <owner>jkarlin@chromium.org</owner>
   <summary>The outcome of Entry::WriteData in the memory cache.</summary>
 </histogram>
@@ -63850,7 +63906,7 @@
 </histogram>
 
 <histogram name="Mobile.CanonicalURLResult" enum="CanonicalURLResult"
-    expires_after="M77">
+    expires_after="M87">
   <owner>pkl@chromium.org</owner>
   <owner>tedchoc@chromium.org</owner>
   <summary>
@@ -66133,7 +66189,11 @@
 
 <histogram name="NativeAppLauncher.InstallationDetected"
     enum="BooleanInstalled" expires_after="2019-12-31">
-  <owner>jif@chromium.org</owner>
+  <obsolete>
+    Removed in M77. This metric is not sufficiently used.
+  </obsolete>
+  <owner>eugenebut@chromium.org</owner>
+  <owner>pkl@chromium.org</owner>
   <summary>
     The number of times that Chrome detected that a request to download and
     install another Google iOS app completed successfully.
@@ -72160,7 +72220,7 @@
 </histogram>
 
 <histogram name="Net.MainFrameNoStore" enum="MainFrameStorable"
-    expires_after="M77">
+    expires_after="M87">
   <owner>jkarlin@chromium.org</owner>
   <summary>
     The distribution of storable vs &quot;cache-control: no-store&quot;
@@ -72687,7 +72747,7 @@
   </summary>
 </histogram>
 
-<histogram name="Net.Prefetch.HitBytes" units="bytes" expires_after="M77">
+<histogram name="Net.Prefetch.HitBytes" units="bytes" expires_after="M87">
   <owner>jkarlin@chromium.org</owner>
   <summary>
     Bytes read for requests that were served from a cache entry whose
@@ -114685,6 +114745,36 @@
   </summary>
 </histogram>
 
+<histogram name="SBClientDownload.ZipArchiveUncompressedSizeOverflow"
+    enum="Boolean" expires_after="M79">
+  <owner>drubery@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Records whether the total uncompressed size of a ZIP overflowed our total.
+    This is logged once per ZIP file scanned.
+  </summary>
+</histogram>
+
+<histogram name="SBClientDownload.ZipCompressionRatio" units="%"
+    expires_after="M79">
+  <owner>drubery@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Records the compression ratio for each scanned ZIP archive. This is logged
+    once per ZIP file scanned, unless
+    SBClientDownload.ZipArchiveUncompressedSizeOverflow is true.
+  </summary>
+</histogram>
+
+<histogram name="SBClientDownload.ZipEntrySize" units="MB" expires_after="M79">
+  <owner>drubery@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Records the uncompressed size of each entry in a scanned ZIP file. This
+    histogram is logged once per entry in the ZIP.
+  </summary>
+</histogram>
+
 <histogram name="SBClientDownload.ZipFileArchivedBinariesCount" units="count">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
@@ -138136,7 +138226,10 @@
   </summary>
 </histogram>
 
-<histogram name="Toolbar.AppMenuTimeToAction" units="ms" expires_after="M77">
+<histogram name="Toolbar.AppMenuTimeToAction" units="ms">
+  <obsolete>
+    Stopped recording 2019-07.
+  </obsolete>
   <owner>rdevlin.cronin@chromium.org</owner>
   <summary>
     The number of millseconds between when the user opens the app menu and when
@@ -153679,9 +153772,16 @@
   <suffix name="Video"
       label="Showing cache patterns only for video resources."/>
   <affected-histogram name="HttpCache.Pattern"/>
-  <affected-histogram
-      name="HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed"/>
-  <affected-histogram name="HttpCache.ValidationCause"/>
+  <affected-histogram name="HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed">
+    <obsolete>
+      Deprecated in M77.
+    </obsolete>
+  </affected-histogram>
+  <affected-histogram name="HttpCache.ValidationCause">
+    <obsolete>
+      Deprecated in M77.
+    </obsolete>
+  </affected-histogram>
 </histogram_suffixes>
 
 <histogram_suffixes name="CacheInstance" separator="." ordering="prefix">
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 6208d3e..bb3c912 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -95,6 +95,9 @@
 # Benchmark: blink_perf.shadow_dom
 crbug.com/702319 [ Nexus_5X ] blink_perf.shadow_dom/* [ Skip ]
 
+# Benchmark: dromaeo
+crbug.com/984578 [ Linux ] dromaeo/http://dromaeo.com?dom-modify [ Skip ]
+
 # Benchmark: dummy_benchmark
 crbug.com/848900 [ Win ] dummy_benchmark.histogram_benchmark_1/dummy_page.html [ Skip ]
 crbug.com/848900 [ Win ] dummy_benchmark.stable_benchmark_1/dummy_page.html [ Skip ]
@@ -273,6 +276,7 @@
 crbug.com/948789 [ Nexus_5X ] startup.mobile/maps_pwa:with_http_cache [ Skip ]
 
 # Benchmark: system_health.common_desktop
+crbug.com/984599 [ Linux ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/773084 [ Mac ] system_health.common_desktop/browse:tools:maps [ Skip ]
 crbug.com/903417 [ Mac ] system_health.common_desktop/long_running:tools:gmail-foreground [ Skip ]
 crbug.com/903417 [ Win ] system_health.common_desktop/long_running:tools:gmail-foreground [ Skip ]
@@ -299,6 +303,7 @@
 crbug.com/979786 [ Nexus5X_Webview ] system_health.common_mobile/browse:news:cricbuzz [ Skip ]
 
 # Benchmark: system_health.memory_desktop
+crbug.com/984599 [ Linux ] system_health.memory_desktop/long_running:tools:gmail-foreground [ Skip ]
 crbug.com/649392 [ All ] system_health.memory_desktop/play:media:google_play_music [ Skip ]
 crbug.com/742475 [ Mac ] system_health.memory_desktop/multitab:misc:typical24 [ Skip ]
 crbug.com/946495 [ Mac ] system_health.memory_desktop/multitab:misc:typical24:2018 [ Skip ]
diff --git a/ui/accessibility/accessibility_switches.cc b/ui/accessibility/accessibility_switches.cc
index 563912d..4f88eb12 100644
--- a/ui/accessibility/accessibility_switches.cc
+++ b/ui/accessibility/accessibility_switches.cc
@@ -54,6 +54,11 @@
       ::switches::kEnableExperimentalAccessibilityLanguageDetection);
 }
 
+bool IsExperimentalAccessibilitySwitchAccessTextEnabled() {
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+      ::switches::kEnableExperimentalAccessibilitySwitchAccessText);
+}
+
 #if defined(OS_WIN)
 // Toggles between IAccessible and UI Automation platform API.
 const char kEnableExperimentalUIAutomation[] =
diff --git a/ui/accessibility/accessibility_switches.h b/ui/accessibility/accessibility_switches.h
index 831e5df..191cee55 100644
--- a/ui/accessibility/accessibility_switches.h
+++ b/ui/accessibility/accessibility_switches.h
@@ -28,6 +28,9 @@
 // Returns true if experimental accessibility language detection is enabled.
 AX_EXPORT bool IsExperimentalAccessibilityLanguageDetectionEnabled();
 
+// Returns true if experimental accessibility switch access text is enabled.
+AX_EXPORT bool IsExperimentalAccessibilitySwitchAccessTextEnabled();
+
 #if defined(OS_WIN)
 AX_EXPORT extern const char kEnableExperimentalUIAutomation[];
 #endif
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn
index 6e33f489..ffb7da2 100644
--- a/ui/display/BUILD.gn
+++ b/ui/display/BUILD.gn
@@ -168,7 +168,7 @@
     "manager/display_manager_utilities_unittest.cc",
     "manager/json_converter_unittest.cc",
     "manager/managed_display_info_unittest.cc",
-    "mojo/display_struct_traits_unittest.cc",
+    "mojom/display_mojom_traits_unittest.cc",
     "screen_unittest.cc",
     "unified_desktop_utils_unittests.cc",
     "util/display_util_unittest.cc",
@@ -204,7 +204,7 @@
     "//testing/gtest",
     "//ui/display/fake",
     "//ui/display/manager",
-    "//ui/display/mojo:interfaces",
+    "//ui/display/mojom:mojom",
     "//ui/display/types",
     "//ui/display/util",
     "//ui/events:test_support",
diff --git a/ui/display/manager/BUILD.gn b/ui/display/manager/BUILD.gn
index c1ccba7..c158f65 100644
--- a/ui/display/manager/BUILD.gn
+++ b/ui/display/manager/BUILD.gn
@@ -59,7 +59,7 @@
   deps = [
     "//base",
     "//ui/base",
-    "//ui/display/mojo:interfaces",
+    "//ui/display/mojom:mojom",
     "//ui/display/util",
     "//ui/events:platform_event",
     "//ui/events/devices",
diff --git a/ui/display/mojo/display_mode.typemap b/ui/display/mojo/display_mode.typemap
deleted file mode 100644
index fc1f37d4..0000000
--- a/ui/display/mojo/display_mode.typemap
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//ui/display/mojo/display_mode.mojom"
-public_headers = [ "//ui/display/types/display_mode.h" ]
-traits_headers = [ "//ui/display/mojo/display_mode_struct_traits.h" ]
-sources = [
-  "//ui/display/mojo/display_mode_struct_traits.cc",
-]
-public_deps = [
-  "//ui/display",
-]
-deps = [
-  "//ui/gfx/geometry",
-]
-type_mappings = [ "display.mojom.DisplayMode=std::unique_ptr<display::DisplayMode>[move_only]" ]
diff --git a/ui/display/mojo/typemaps.gni b/ui/display/mojo/typemaps.gni
deleted file mode 100644
index e352a044..0000000
--- a/ui/display/mojo/typemaps.gni
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-typemaps = [
-  "//ui/display/mojo/display.typemap",
-  "//ui/display/mojo/display_constants.typemap",
-  "//ui/display/mojo/display_layout.typemap",
-  "//ui/display/mojo/display_mode.typemap",
-  "//ui/display/mojo/display_snapshot.typemap",
-  "//ui/display/mojo/gamma_ramp_rgb_entry.typemap",
-]
diff --git a/ui/display/mojo/BUILD.gn b/ui/display/mojom/BUILD.gn
similarity index 95%
rename from ui/display/mojo/BUILD.gn
rename to ui/display/mojom/BUILD.gn
index c60046c..fb7b9649 100644
--- a/ui/display/mojo/BUILD.gn
+++ b/ui/display/mojom/BUILD.gn
@@ -4,7 +4,7 @@
 
 import("//mojo/public/tools/bindings/mojom.gni")
 
-mojom("interfaces") {
+mojom("mojom") {
   sources = [
     "display.mojom",
     "display_constants.mojom",
diff --git a/ui/display/mojo/OWNERS b/ui/display/mojom/OWNERS
similarity index 61%
rename from ui/display/mojo/OWNERS
rename to ui/display/mojom/OWNERS
index e75daf74..7ed4e44 100644
--- a/ui/display/mojo/OWNERS
+++ b/ui/display/mojom/OWNERS
@@ -1,5 +1,5 @@
-per-file *_struct_traits*.*=set noparent
-per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS
+per-file *_mojom_traits*.*=set noparent
+per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
 
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/ui/display/mojo/display.mojom b/ui/display/mojom/display.mojom
similarity index 100%
rename from ui/display/mojo/display.mojom
rename to ui/display/mojom/display.mojom
diff --git a/ui/display/mojo/display.typemap b/ui/display/mojom/display.typemap
similarity index 79%
rename from ui/display/mojo/display.typemap
rename to ui/display/mojom/display.typemap
index 7bf184f..0625a2e 100644
--- a/ui/display/mojo/display.typemap
+++ b/ui/display/mojom/display.typemap
@@ -2,11 +2,11 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-mojom = "//ui/display/mojo/display.mojom"
+mojom = "//ui/display/mojom/display.mojom"
 public_headers = [ "//ui/display/display.h" ]
-traits_headers = [ "//ui/display/mojo/display_struct_traits.h" ]
+traits_headers = [ "//ui/display/mojom/display_mojom_traits.h" ]
 sources = [
-  "//ui/display/mojo/display_struct_traits.cc",
+  "//ui/display/mojom/display_mojom_traits.cc",
 ]
 public_deps = [
   "//ui/display",
diff --git a/ui/display/mojo/display_constants.mojom b/ui/display/mojom/display_constants.mojom
similarity index 100%
rename from ui/display/mojo/display_constants.mojom
rename to ui/display/mojom/display_constants.mojom
diff --git a/ui/display/mojo/display_constants.typemap b/ui/display/mojom/display_constants.typemap
similarity index 70%
rename from ui/display/mojo/display_constants.typemap
rename to ui/display/mojom/display_constants.typemap
index 4c0b4ae1..fcefbac 100644
--- a/ui/display/mojo/display_constants.typemap
+++ b/ui/display/mojom/display_constants.typemap
@@ -2,11 +2,11 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-mojom = "//ui/display/mojo/display_constants.mojom"
+mojom = "//ui/display/mojom/display_constants.mojom"
 public_headers = [ "//ui/display/types/display_constants.h" ]
-traits_headers = [ "//ui/display/mojo/display_constants_struct_traits.h" ]
+traits_headers = [ "//ui/display/mojom/display_constants_mojom_traits.h" ]
 sources = [
-  "//ui/display/mojo/display_constants_struct_traits.cc",
+  "//ui/display/mojom/display_constants_mojom_traits.cc",
 ]
 public_deps = [
   "//ui/display",
diff --git a/ui/display/mojo/display_constants_struct_traits.cc b/ui/display/mojom/display_constants_mojom_traits.cc
similarity index 98%
rename from ui/display/mojo/display_constants_struct_traits.cc
rename to ui/display/mojom/display_constants_mojom_traits.cc
index c5cc013..a34a657 100644
--- a/ui/display/mojo/display_constants_struct_traits.cc
+++ b/ui/display/mojom/display_constants_mojom_traits.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/display/mojo/display_constants_struct_traits.h"
+#include "ui/display/mojom/display_constants_mojom_traits.h"
 
 namespace mojo {
 
diff --git a/ui/display/mojo/display_constants_struct_traits.h b/ui/display/mojom/display_constants_mojom_traits.h
similarity index 78%
rename from ui/display/mojo/display_constants_struct_traits.h
rename to ui/display/mojom/display_constants_mojom_traits.h
index 9ecf7cc..24ab48d 100644
--- a/ui/display/mojo/display_constants_struct_traits.h
+++ b/ui/display/mojom/display_constants_mojom_traits.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_DISPLAY_MOJO_DISPLAY_CONSTANTS_STRUCT_TRAITS_H_
-#define UI_DISPLAY_MOJO_DISPLAY_CONSTANTS_STRUCT_TRAITS_H_
+#ifndef UI_DISPLAY_MOJOM_DISPLAY_CONSTANTS_MOJOM_TRAITS_H_
+#define UI_DISPLAY_MOJOM_DISPLAY_CONSTANTS_MOJOM_TRAITS_H_
 
-#include "ui/display/mojo/display_constants.mojom.h"
+#include "ui/display/mojom/display_constants.mojom.h"
 #include "ui/display/types/display_constants.h"
 
 namespace mojo {
@@ -28,4 +28,4 @@
 
 }  // namespace mojo
 
-#endif  // UI_DISPLAY_MOJO_DISPLAY_CONSTANTS_STRUCT_TRAITS_H_
+#endif  // UI_DISPLAY_MOJOM_DISPLAY_CONSTANTS_MOJOM_TRAITS_H_
diff --git a/ui/display/mojo/display_layout.mojom b/ui/display/mojom/display_layout.mojom
similarity index 100%
rename from ui/display/mojo/display_layout.mojom
rename to ui/display/mojom/display_layout.mojom
diff --git a/ui/display/mojo/display_layout.typemap b/ui/display/mojom/display_layout.typemap
similarity index 77%
rename from ui/display/mojo/display_layout.typemap
rename to ui/display/mojom/display_layout.typemap
index d524e562..652ffb2 100644
--- a/ui/display/mojo/display_layout.typemap
+++ b/ui/display/mojom/display_layout.typemap
@@ -2,11 +2,11 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-mojom = "//ui/display/mojo/display_layout.mojom"
+mojom = "//ui/display/mojom/display_layout.mojom"
 public_headers = [ "//ui/display/display_layout.h" ]
-traits_headers = [ "//ui/display/mojo/display_layout_struct_traits.h" ]
+traits_headers = [ "//ui/display/mojom/display_layout_mojom_traits.h" ]
 sources = [
-  "//ui/display/mojo/display_layout_struct_traits.cc",
+  "//ui/display/mojom/display_layout_mojom_traits.cc",
 ]
 public_deps = [
   "//ui/display",
diff --git a/ui/display/mojo/display_layout_struct_traits.cc b/ui/display/mojom/display_layout_mojom_traits.cc
similarity index 97%
rename from ui/display/mojo/display_layout_struct_traits.cc
rename to ui/display/mojom/display_layout_mojom_traits.cc
index 24a9d87..af247ab1 100644
--- a/ui/display/mojo/display_layout_struct_traits.cc
+++ b/ui/display/mojom/display_layout_mojom_traits.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/display/mojo/display_layout_struct_traits.h"
+#include "ui/display/mojom/display_layout_mojom_traits.h"
 
 namespace mojo {
 
diff --git a/ui/display/mojo/display_layout_struct_traits.h b/ui/display/mojom/display_layout_mojom_traits.h
similarity index 91%
rename from ui/display/mojo/display_layout_struct_traits.h
rename to ui/display/mojom/display_layout_mojom_traits.h
index 45b109ad..cf161dc4 100644
--- a/ui/display/mojo/display_layout_struct_traits.h
+++ b/ui/display/mojom/display_layout_mojom_traits.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_DISPLAY_MOJO_DISPLAY_LAYOUT_STRUCT_TRAITS_H_
-#define UI_DISPLAY_MOJO_DISPLAY_LAYOUT_STRUCT_TRAITS_H_
+#ifndef UI_DISPLAY_MOJOM_DISPLAY_LAYOUT_MOJOM_TRAITS_H_
+#define UI_DISPLAY_MOJOM_DISPLAY_LAYOUT_MOJOM_TRAITS_H_
 
 #include <memory>
 #include <vector>
 
 #include "ui/display/display_layout.h"
-#include "ui/display/mojo/display_layout.mojom.h"
+#include "ui/display/mojom/display_layout.mojom.h"
 
 namespace mojo {
 
@@ -84,4 +84,4 @@
 
 }  // namespace mojo
 
-#endif  // UI_DISPLAY_MOJO_DISPLAY_LAYOUT_STRUCT_TRAITS_H_
+#endif  // UI_DISPLAY_MOJOM_DISPLAY_MOJOM_TRAITS_H_
diff --git a/ui/display/mojo/display_mode.mojom b/ui/display/mojom/display_mode.mojom
similarity index 100%
rename from ui/display/mojo/display_mode.mojom
rename to ui/display/mojom/display_mode.mojom
diff --git a/ui/display/mojom/display_mode.typemap b/ui/display/mojom/display_mode.typemap
new file mode 100644
index 0000000..3cbe5f3
--- /dev/null
+++ b/ui/display/mojom/display_mode.typemap
@@ -0,0 +1,19 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//ui/display/mojom/display_mode.mojom"
+public_headers = [ "//ui/display/types/display_mode.h" ]
+traits_headers = [ "//ui/display/mojom/display_mode_mojom_traits.h" ]
+sources = [
+  "//ui/display/mojom/display_mode_mojom_traits.cc",
+]
+public_deps = [
+  "//ui/display",
+]
+deps = [
+  "//ui/gfx/geometry",
+]
+type_mappings = [
+  "display.mojom.DisplayMode=std::unique_ptr<display::DisplayMode>[move_only]",
+]
diff --git a/ui/display/mojo/display_mode_struct_traits.cc b/ui/display/mojom/display_mode_mojom_traits.cc
similarity index 92%
rename from ui/display/mojo/display_mode_struct_traits.cc
rename to ui/display/mojom/display_mode_mojom_traits.cc
index 7c65a2d..688d435 100644
--- a/ui/display/mojo/display_mode_struct_traits.cc
+++ b/ui/display/mojom/display_mode_mojom_traits.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/display/mojo/display_mode_struct_traits.h"
+#include "ui/display/mojom/display_mode_mojom_traits.h"
 
 #include "ui/gfx/geometry/mojo/geometry_struct_traits.h"
 
diff --git a/ui/display/mojo/display_mode_struct_traits.h b/ui/display/mojom/display_mode_mojom_traits.h
similarity index 81%
rename from ui/display/mojo/display_mode_struct_traits.h
rename to ui/display/mojom/display_mode_mojom_traits.h
index 2990846d..a47c72a 100644
--- a/ui/display/mojo/display_mode_struct_traits.h
+++ b/ui/display/mojom/display_mode_mojom_traits.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_DISPLAY_MOJO_DISPLAY_MODE_STRUCT_TRAITS_H_
-#define UI_DISPLAY_MOJO_DISPLAY_MODE_STRUCT_TRAITS_H_
+#ifndef UI_DISPLAY_MOJOM_DISPLAY_MODE_MOJOM_TRAITS_H_
+#define UI_DISPLAY_MOJOM_DISPLAY_MODE_MOJOM_TRAITS_H_
 
+#include "ui/display/mojom/display_mode.mojom.h"
 #include "ui/display/types/display_mode.h"
-#include "ui/display/mojo/display_mode.mojom.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace mojo {
@@ -35,4 +35,4 @@
 
 }  // namespace mojo
 
-#endif  // UI_DISPLAY_MOJO_DISPLAY_MODE_STRUCT_TRAITS_H_
+#endif  // UI_DISPLAY_MOJOM_DISPLAY_MODE_MOJOM_TRAITS_H_
diff --git a/ui/display/mojo/display_struct_traits.cc b/ui/display/mojom/display_mojom_traits.cc
similarity index 98%
rename from ui/display/mojo/display_struct_traits.cc
rename to ui/display/mojom/display_mojom_traits.cc
index acbcaab..0df6fc4 100644
--- a/ui/display/mojo/display_struct_traits.cc
+++ b/ui/display/mojom/display_mojom_traits.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/display/mojo/display_struct_traits.h"
+#include "ui/display/mojom/display_mojom_traits.h"
 
 namespace mojo {
 
diff --git a/ui/display/mojo/display_struct_traits.h b/ui/display/mojom/display_mojom_traits.h
similarity index 93%
rename from ui/display/mojo/display_struct_traits.h
rename to ui/display/mojom/display_mojom_traits.h
index 055cd8b..2937b936 100644
--- a/ui/display/mojo/display_struct_traits.h
+++ b/ui/display/mojom/display_mojom_traits.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_DISPLAY_MOJO_DISPLAY_STRUCT_TRAITS_H_
-#define UI_DISPLAY_MOJO_DISPLAY_STRUCT_TRAITS_H_
+#ifndef UI_DISPLAY_MOJOM_DISPLAY_MOJOM_TRAITS_H_
+#define UI_DISPLAY_MOJOM_DISPLAY_MOJOM_TRAITS_H_
 
 #include "ui/display/display.h"
-#include "ui/display/mojo/display.mojom.h"
+#include "ui/display/mojom/display.mojom.h"
 #include "ui/gfx/geometry/mojo/geometry_struct_traits.h"
 
 namespace mojo {
@@ -95,4 +95,4 @@
 
 }  // namespace mojo
 
-#endif  // UI_DISPLAY_MOJO_DISPLAY_STRUCT_TRAITS_H_
+#endif  // UI_DISPLAY_MOJOM_DISPLAY_MOJOM_TRAITS_H_
diff --git a/ui/display/mojo/display_struct_traits_unittest.cc b/ui/display/mojom/display_mojom_traits_unittest.cc
similarity index 97%
rename from ui/display/mojo/display_struct_traits_unittest.cc
rename to ui/display/mojom/display_mojom_traits_unittest.cc
index b4c0b3b..5038f2a2 100644
--- a/ui/display/mojo/display_struct_traits_unittest.cc
+++ b/ui/display/mojom/display_mojom_traits_unittest.cc
@@ -12,11 +12,11 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/display/display.h"
 #include "ui/display/display_layout.h"
-#include "ui/display/mojo/display_layout_struct_traits.h"
-#include "ui/display/mojo/display_mode_struct_traits.h"
-#include "ui/display/mojo/display_snapshot_struct_traits.h"
-#include "ui/display/mojo/display_struct_traits.h"
-#include "ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h"
+#include "ui/display/mojom/display_layout_mojom_traits.h"
+#include "ui/display/mojom/display_mode_mojom_traits.h"
+#include "ui/display/mojom/display_mojom_traits.h"
+#include "ui/display/mojom/display_snapshot_mojom_traits.h"
+#include "ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h"
 #include "ui/display/types/display_constants.h"
 #include "ui/display/types/display_mode.h"
 #include "ui/display/types/display_snapshot.h"
diff --git a/ui/display/mojo/display_rotation_for_blink.typemap b/ui/display/mojom/display_rotation_for_blink.typemap
similarity index 69%
rename from ui/display/mojo/display_rotation_for_blink.typemap
rename to ui/display/mojom/display_rotation_for_blink.typemap
index 9e8394b..78d24b36 100644
--- a/ui/display/mojo/display_rotation_for_blink.typemap
+++ b/ui/display/mojom/display_rotation_for_blink.typemap
@@ -2,11 +2,11 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-mojom = "//ui/display/mojo/display.mojom"
+mojom = "//ui/display/mojom/display.mojom"
 public_headers = [ "//ui/display/display.h" ]
-traits_headers = [ "//ui/display/mojo/display_struct_traits.h" ]
+traits_headers = [ "//ui/display/mojom/display_mojom_traits.h" ]
 public_deps = [
   "//ui/display",
-  "//ui/display/mojo:interfaces",
+  "//ui/display/mojom:mojom",
 ]
 type_mappings = [ "display.mojom.Rotation=display::Display::Rotation" ]
diff --git a/ui/display/mojo/display_snapshot.mojom b/ui/display/mojom/display_snapshot.mojom
similarity index 91%
rename from ui/display/mojo/display_snapshot.mojom
rename to ui/display/mojom/display_snapshot.mojom
index 9c358b5..95c32cb 100644
--- a/ui/display/mojo/display_snapshot.mojom
+++ b/ui/display/mojom/display_snapshot.mojom
@@ -5,8 +5,8 @@
 module display.mojom;
 
 import "mojo/public/mojom/base/file_path.mojom";
-import "ui/display/mojo/display_constants.mojom";
-import "ui/display/mojo/display_mode.mojom";
+import "ui/display/mojom/display_constants.mojom";
+import "ui/display/mojom/display_mode.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
 import "ui/gfx/mojo/color_space.mojom";
 
diff --git a/ui/display/mojo/display_snapshot.typemap b/ui/display/mojom/display_snapshot.typemap
similarity index 70%
rename from ui/display/mojo/display_snapshot.typemap
rename to ui/display/mojom/display_snapshot.typemap
index 4668070..f9d8d07 100644
--- a/ui/display/mojo/display_snapshot.typemap
+++ b/ui/display/mojom/display_snapshot.typemap
@@ -2,11 +2,11 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-mojom = "//ui/display/mojo/display_snapshot.mojom"
+mojom = "//ui/display/mojom/display_snapshot.mojom"
 public_headers = [ "//ui/display/types/display_snapshot.h" ]
-traits_headers = [ "//ui/display/mojo/display_snapshot_struct_traits.h" ]
+traits_headers = [ "//ui/display/mojom/display_snapshot_mojom_traits.h" ]
 sources = [
-  "//ui/display/mojo/display_snapshot_struct_traits.cc",
+  "//ui/display/mojom/display_snapshot_mojom_traits.cc",
 ]
 public_deps = [
   "//ui/display",
diff --git a/ui/display/mojo/display_snapshot_struct_traits.cc b/ui/display/mojom/display_snapshot_mojom_traits.cc
similarity index 98%
rename from ui/display/mojo/display_snapshot_struct_traits.cc
rename to ui/display/mojom/display_snapshot_mojom_traits.cc
index 21eb7044..0c5373e 100644
--- a/ui/display/mojo/display_snapshot_struct_traits.cc
+++ b/ui/display/mojom/display_snapshot_mojom_traits.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/display/mojo/display_snapshot_struct_traits.h"
+#include "ui/display/mojom/display_snapshot_mojom_traits.h"
 
 #include "mojo/public/cpp/base/file_path_mojom_traits.h"
 #include "ui/display/types/display_constants.h"
diff --git a/ui/display/mojo/display_snapshot_struct_traits.h b/ui/display/mojom/display_snapshot_mojom_traits.h
similarity index 90%
rename from ui/display/mojo/display_snapshot_struct_traits.h
rename to ui/display/mojom/display_snapshot_mojom_traits.h
index 0267d56c..55c1579 100644
--- a/ui/display/mojo/display_snapshot_struct_traits.h
+++ b/ui/display/mojom/display_snapshot_mojom_traits.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_DISPLAY_MOJO_DISPLAY_SNAPSHOT_MOJO_STRUCT_TRAITS_H_
-#define UI_DISPLAY_MOJO_DISPLAY_SNAPSHOT_MOJO_STRUCT_TRAITS_H_
+#ifndef UI_DISPLAY_MOJOM_DISPLAY_SNAPSHOT_MOJOM_TRAITS_H_
+#define UI_DISPLAY_MOJOM_DISPLAY_SNAPSHOT_MOJOM_TRAITS_H_
 
 #include "ipc/ipc_message_utils.h"
-#include "ui/display/mojo/display_constants_struct_traits.h"
-#include "ui/display/mojo/display_mode_struct_traits.h"
-#include "ui/display/mojo/display_snapshot.mojom.h"
+#include "ui/display/mojom/display_constants_mojom_traits.h"
+#include "ui/display/mojom/display_mode_mojom_traits.h"
+#include "ui/display/mojom/display_snapshot.mojom.h"
 #include "ui/display/types/display_mode.h"
 #include "ui/display/types/display_snapshot.h"
 #include "ui/gfx/geometry/mojo/geometry_struct_traits.h"
@@ -119,4 +119,4 @@
 
 }  // namespace mojo
 
-#endif  // UI_DISPLAY_MOJO_DISPLAY_SNAPSHOT_MOJO_STRUCT_TRAITS_H_
+#endif  // UI_DISPLAY_MOJOM_DISPLAY_SNAPSHOT_MOJOM_TRAITS_H_
diff --git a/ui/display/mojo/gamma_ramp_rgb_entry.mojom b/ui/display/mojom/gamma_ramp_rgb_entry.mojom
similarity index 100%
rename from ui/display/mojo/gamma_ramp_rgb_entry.mojom
rename to ui/display/mojom/gamma_ramp_rgb_entry.mojom
diff --git a/ui/display/mojo/gamma_ramp_rgb_entry.typemap b/ui/display/mojom/gamma_ramp_rgb_entry.typemap
similarity index 64%
rename from ui/display/mojo/gamma_ramp_rgb_entry.typemap
rename to ui/display/mojom/gamma_ramp_rgb_entry.typemap
index 2618fe9..d93d295 100644
--- a/ui/display/mojo/gamma_ramp_rgb_entry.typemap
+++ b/ui/display/mojom/gamma_ramp_rgb_entry.typemap
@@ -2,11 +2,11 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-mojom = "//ui/display/mojo/gamma_ramp_rgb_entry.mojom"
+mojom = "//ui/display/mojom/gamma_ramp_rgb_entry.mojom"
 public_headers = [ "//ui/display/types/gamma_ramp_rgb_entry.h" ]
-traits_headers = [ "//ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h" ]
+traits_headers = [ "//ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h" ]
 sources = [
-  "//ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.cc",
+  "//ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.cc",
 ]
 public_deps = [
   "//ui/display",
diff --git a/ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.cc b/ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.cc
similarity index 88%
rename from ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.cc
rename to ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.cc
index 6ac8ecb..19a34fc 100644
--- a/ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.cc
+++ b/ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h"
+#include "ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h"
 
 namespace mojo {
 
diff --git a/ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h b/ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h
similarity index 77%
rename from ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h
rename to ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h
index 68c19f5..30c4c1a 100644
--- a/ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h
+++ b/ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_DISPLAY_MOJO_GAMMA_RAMP_RGB_ENTRY_STRUCT_TRAITS_H_
-#define UI_DISPLAY_MOJO_GAMMA_RAMP_RGB_ENTRY_STRUCT_TRAITS_H_
+#ifndef UI_DISPLAY_MOJOM_GAMMA_RAMP_RGB_ENTRY_MOJOM_TRAITS_H_
+#define UI_DISPLAY_MOJOM_GAMMA_RAMP_RGB_ENTRY_MOJOM_TRAITS_H_
 
-#include "ui/display/mojo/gamma_ramp_rgb_entry.mojom.h"
+#include "ui/display/mojom/gamma_ramp_rgb_entry.mojom.h"
 #include "ui/display/types/gamma_ramp_rgb_entry.h"
 
 namespace mojo {
@@ -31,4 +31,4 @@
 
 }  // namespace mojo
 
-#endif  // UI_DISPLAY_MOJO_GAMMA_RAMP_RGB_ENTRY_STRUCT_TRAITS_H_
+#endif  // UI_DISPLAY_MOJOM_GAMMA_RAMP_RGB_ENTRY_MOJOM_TRAITS_H_
diff --git a/ui/display/mojom/typemaps.gni b/ui/display/mojom/typemaps.gni
new file mode 100644
index 0000000..1cbc47b1
--- /dev/null
+++ b/ui/display/mojom/typemaps.gni
@@ -0,0 +1,12 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+typemaps = [
+  "//ui/display/mojom/display.typemap",
+  "//ui/display/mojom/display_constants.typemap",
+  "//ui/display/mojom/display_layout.typemap",
+  "//ui/display/mojom/display_mode.typemap",
+  "//ui/display/mojom/display_snapshot.typemap",
+  "//ui/display/mojom/gamma_ramp_rgb_entry.typemap",
+]
diff --git a/ui/message_center/views/message_view.cc b/ui/message_center/views/message_view.cc
index 65bee0e..468a330 100644
--- a/ui/message_center/views/message_view.cc
+++ b/ui/message_center/views/message_view.cc
@@ -9,9 +9,9 @@
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
-#include "ui/compositor/paint_recorder.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/canvas.h"
+#include "ui/gfx/color_palette.h"
 #include "ui/gfx/image/image_skia_operations.h"
 #include "ui/gfx/shadow_util.h"
 #include "ui/gfx/shadow_value.h"
@@ -26,6 +26,8 @@
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/scroll_view.h"
 #include "ui/views/focus/focus_manager.h"
+#include "ui/views/style/platform_style.h"
+#include "ui/views/view_class_properties.h"
 #include "ui/views/widget/widget.h"
 
 #if defined(OS_WIN)
@@ -72,14 +74,15 @@
 MessageView::MessageView(const Notification& notification)
     : notification_id_(notification.id()), slide_out_controller_(this, this) {
   SetFocusBehavior(FocusBehavior::ALWAYS);
+  focus_ring_ = views::FocusRing::Install(this);
+
+  // TODO(amehfooz): Remove explicit color setting after native theme changes.
+  focus_ring_->SetColor(gfx::kGoogleBlue500);
 
   // Paint to a dedicated layer to make the layer non-opaque.
   SetPaintToLayer();
   layer()->SetFillsBoundsOpaquely(false);
 
-  focus_painter_ = views::Painter::CreateSolidFocusPainter(
-      kFocusBorderColor, gfx::Insets(0, 0, 1, 1));
-
   UpdateWithNotification(notification);
 
   UpdateCornerRadius(0, 0);
@@ -155,12 +158,41 @@
 }
 
 void MessageView::UpdateCornerRadius(int top_radius, int bottom_radius) {
+  SetCornerRadius(top_radius, bottom_radius);
   SetBackground(views::CreateBackgroundFromPainter(
       std::make_unique<NotificationBackgroundPainter>(top_radius,
                                                       bottom_radius)));
   SchedulePaint();
 }
 
+void MessageView::UpdateFocusHighlight() {
+  gfx::Rect rect(GetBoundsInScreen().size());
+  // Shrink focus ring size by -kFocusHaloInset on each side to draw
+  // them on top of the notifications. We need to do this because TrayBubbleView
+  // has a layer that masks to bounds due to which the focus ring can not extend
+  // outside the view. This is not required on the bottom most notification's
+  // bottom side.
+  int inset = -views::PlatformStyle::kFocusHaloInset;
+  int bottom_inset = bottom_radius_ == 0 ? inset : 0;
+  rect.Inset(gfx::Insets(inset, inset, bottom_inset, inset));
+
+  int top_radius = std::max(0, top_radius_ - inset);
+  int bottom_radius = std::max(0, bottom_radius_ - inset);
+  SkScalar radii[8] = {top_radius,    top_radius,      // top-left
+                       top_radius,    top_radius,      // top-right
+                       bottom_radius, bottom_radius,   // bottom-right
+                       bottom_radius, bottom_radius};  // bottom-left
+
+  auto path = std::make_unique<SkPath>();
+  path->addRoundRect(gfx::RectToSkRect(rect), radii);
+  SetProperty(views::kHighlightPathKey, path.release());
+}
+
+void MessageView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
+  views::InkDropHostView::OnBoundsChanged(previous_bounds);
+  UpdateFocusHighlight();
+}
+
 void MessageView::OnContainerAnimationStarted() {
   // Not implemented by default.
 }
@@ -220,15 +252,6 @@
   return true;
 }
 
-void MessageView::PaintChildren(const views::PaintInfo& paint_info) {
-  views::View::PaintChildren(paint_info);
-
-  // Paint focus ring on top of all the children.
-  ui::PaintRecorder recorder(paint_info.context(), size());
-  views::Painter::PaintFocusPainter(this, recorder.canvas(),
-                                    focus_painter_.get());
-}
-
 void MessageView::OnPaint(gfx::Canvas* canvas) {
   if (ShouldShowAeroShadowBorder()) {
     // If the border is shadow, paint border first.
@@ -241,12 +264,6 @@
   }
 }
 
-void MessageView::OnFocus() {
-  views::View::OnFocus();
-  // We paint a focus indicator.
-  SchedulePaint();
-}
-
 void MessageView::OnBlur() {
   views::View::OnBlur();
   // We paint a focus indicator.
@@ -390,6 +407,11 @@
   slide_out_controller_.SetSwipeControlWidth(control_button_width);
 }
 
+void MessageView::SetCornerRadius(int top_radius, int bottom_radius) {
+  top_radius_ = top_radius;
+  bottom_radius_ = bottom_radius;
+}
+
 void MessageView::OnCloseButtonPressed() {
   MessageCenter::Get()->RemoveNotification(notification_id_,
                                            true /* by_user */);
diff --git a/ui/message_center/views/message_view.h b/ui/message_center/views/message_view.h
index c9f0809..59a20ec9 100644
--- a/ui/message_center/views/message_view.h
+++ b/ui/message_center/views/message_view.h
@@ -20,11 +20,11 @@
 #include "ui/message_center/public/cpp/notification_delegate.h"
 #include "ui/message_center/views/slide_out_controller.h"
 #include "ui/views/animation/ink_drop_host_view.h"
+#include "ui/views/controls/focus_ring.h"
 #include "ui/views/focus/focus_manager.h"
 #include "ui/views/view.h"
 
 namespace views {
-class Painter;
 class ScrollView;
 }  // namespace views
 
@@ -118,9 +118,8 @@
   void OnMouseReleased(const ui::MouseEvent& event) override;
   bool OnKeyPressed(const ui::KeyEvent& event) override;
   bool OnKeyReleased(const ui::KeyEvent& event) override;
-  void PaintChildren(const views::PaintInfo& paint_info) override;
   void OnPaint(gfx::Canvas* canvas) override;
-  void OnFocus() override;
+  void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
   void OnBlur() override;
   void OnGestureEvent(ui::GestureEvent* event) override;
   void RemovedFromWidget() override;
@@ -165,6 +164,13 @@
   // Changes the background color and schedules a paint.
   virtual void SetDrawBackgroundAsActive(bool active);
 
+  // Update the focus ring highlight for the notification.
+  // Adds a highlight path based on the notification's bounds
+  // and corner radii.
+  void UpdateFocusHighlight();
+
+  void SetCornerRadius(int top_radius, int bottom_radius);
+
   views::ScrollView* scroller() { return scroller_; }
 
   bool is_nested() const { return is_nested_; }
@@ -190,8 +196,6 @@
   // "fixed" mode flag. See the comment in MessageView::Mode for detail.
   bool setting_mode_ = false;
 
-  std::unique_ptr<views::Painter> focus_painter_;
-
   SlideOutController slide_out_controller_;
   base::ObserverList<SlideObserver>::Unchecked slide_observers_;
 
@@ -203,6 +207,12 @@
   bool disable_slide_ = false;
 
   views::FocusManager* focus_manager_ = nullptr;
+  std::unique_ptr<views::FocusRing> focus_ring_;
+
+  // Radius values used to determine the rounding for the rounded rectangular
+  // shape of the notification.
+  int top_radius_ = 0;
+  int bottom_radius_ = 0;
 
   DISALLOW_COPY_AND_ASSIGN(MessageView);
 };
diff --git a/ui/ozone/public/interfaces/BUILD.gn b/ui/ozone/public/interfaces/BUILD.gn
index 59433b6..6fa3384d 100644
--- a/ui/ozone/public/interfaces/BUILD.gn
+++ b/ui/ozone/public/interfaces/BUILD.gn
@@ -16,7 +16,7 @@
   public_deps = [
     "//mojo/public/mojom/base",
     "//skia/public/interfaces:interfaces",
-    "//ui/display/mojo:interfaces",
+    "//ui/display/mojom",
     "//ui/gfx/geometry/mojo",
     "//ui/gfx/mojo",
   ]
diff --git a/ui/ozone/public/interfaces/drm_device.mojom b/ui/ozone/public/interfaces/drm_device.mojom
index d6ae55e..511d4a2 100644
--- a/ui/ozone/public/interfaces/drm_device.mojom
+++ b/ui/ozone/public/interfaces/drm_device.mojom
@@ -6,10 +6,10 @@
 
 import "mojo/public/mojom/base/file.mojom";
 import "mojo/public/mojom/base/file_path.mojom";
-import "ui/display/mojo/display_constants.mojom";
-import "ui/display/mojo/display_mode.mojom";
-import "ui/display/mojo/display_snapshot.mojom";
-import "ui/display/mojo/gamma_ramp_rgb_entry.mojom";
+import "ui/display/mojom/display_constants.mojom";
+import "ui/display/mojom/display_mode.mojom";
+import "ui/display/mojom/display_snapshot.mojom";
+import "ui/display/mojom/gamma_ramp_rgb_entry.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
 import "ui/gfx/mojo/accelerated_widget.mojom";
 import "ui/ozone/public/interfaces/device_cursor.mojom";
diff --git a/ui/ozone/testhelpers/BUILD.gn b/ui/ozone/testhelpers/BUILD.gn
new file mode 100644
index 0000000..6c874a73
--- /dev/null
+++ b/ui/ozone/testhelpers/BUILD.gn
@@ -0,0 +1,15 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+static_library("mock_gesture_properties_service") {
+  testonly = true
+  sources = [
+    "mock_gesture_properties_service.h",
+  ]
+  public_deps = [
+    "//testing/gmock",
+    "//third_party/googletest:gmock",
+    "//ui/ozone/public/interfaces:gesture_properties_service",
+  ]
+}
diff --git a/ui/ozone/testhelpers/DEPS b/ui/ozone/testhelpers/DEPS
new file mode 100644
index 0000000..86cba92
--- /dev/null
+++ b/ui/ozone/testhelpers/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+gmock",
+]
diff --git a/ui/ozone/testhelpers/README.md b/ui/ozone/testhelpers/README.md
new file mode 100644
index 0000000..5203b88e
--- /dev/null
+++ b/ui/ozone/testhelpers/README.md
@@ -0,0 +1,3 @@
+This directory contains code that Ozone consumers might find useful for building
+tests (such as mock classes for public interfaces). Code for testing Ozone
+itself should be placed elsewhere.
diff --git a/ui/ozone/testhelpers/mock_gesture_properties_service.h b/ui/ozone/testhelpers/mock_gesture_properties_service.h
new file mode 100644
index 0000000..55af852
--- /dev/null
+++ b/ui/ozone/testhelpers/mock_gesture_properties_service.h
@@ -0,0 +1,34 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_TESTHELPERS_MOCK_GESTURE_PROPERTIES_SERVICE_H_
+#define UI_OZONE_TESTHELPERS_MOCK_GESTURE_PROPERTIES_SERVICE_H_
+
+#include "gmock/gmock.h"
+#include "ui/ozone/public/interfaces/gesture_properties_service.mojom.h"
+
+// Mock of GesturePropertiesService's C++ bindings, useful for tests.
+class MockGesturePropertiesService
+    : public ui::ozone::mojom::GesturePropertiesService {
+ public:
+  MockGesturePropertiesService();
+  ~MockGesturePropertiesService();
+
+  MOCK_METHOD1(ListDevices, void(ListDevicesCallback));
+  MOCK_METHOD2(ListProperties, void(int32_t, ListPropertiesCallback));
+  MOCK_METHOD3(GetProperty,
+               void(int32_t, const std::string&, GetPropertyCallback));
+  MOCK_METHOD4(SetProperty,
+               void(int32_t,
+                    const std::string&,
+                    ui::ozone::mojom::GesturePropValuePtr,
+                    SetPropertyCallback));
+};
+
+// Work around the compile error '[chromium-style] Complex class/struct needs an
+// explicit out-of-line constructor.'
+inline MockGesturePropertiesService::MockGesturePropertiesService() = default;
+inline MockGesturePropertiesService::~MockGesturePropertiesService() = default;
+
+#endif  // UI_OZONE_TESTHELPERS_MOCK_GESTURE_PROPERTIES_SERVICE_H_
diff --git a/ui/views/animation/ink_drop_host_view.cc b/ui/views/animation/ink_drop_host_view.cc
index a6fcea7..5f8a9ac 100644
--- a/ui/views/animation/ink_drop_host_view.cc
+++ b/ui/views/animation/ink_drop_host_view.cc
@@ -105,7 +105,7 @@
 
 void InkDropHostView::AnimateInkDrop(InkDropState state,
                                      const ui::LocatedEvent* event) {
-  ink_drop_event_handler_.AnimateInkDrop(state, event);
+  GetEventHandler()->AnimateInkDrop(state, event);
 }
 
 std::unique_ptr<InkDropImpl> InkDropHostView::CreateDefaultInkDropImpl() {
@@ -170,9 +170,8 @@
 }
 
 gfx::Point InkDropHostView::GetInkDropCenterBasedOnLastEvent() const {
-  return ink_drop_event_handler_.GetLastRippleTriggeringEvent()
-             ? ink_drop_event_handler_.GetLastRippleTriggeringEvent()
-                   ->location()
+  return GetEventHandler()->GetLastRippleTriggeringEvent()
+             ? GetEventHandler()->GetLastRippleTriggeringEvent()->location()
              : GetMirroredRect(GetContentsBounds()).CenterPoint();
 }
 
@@ -195,6 +194,17 @@
   return gfx::ScaleToCeiledSize(gfx::Size(small_size), kLargeInkDropScale);
 }
 
+const InkDropEventHandler* InkDropHostView::GetEventHandler() const {
+  if (ink_drop_event_handler_override_)
+    return ink_drop_event_handler_override_;
+  return &ink_drop_event_handler_;
+}
+
+InkDropEventHandler* InkDropHostView::GetEventHandler() {
+  return const_cast<InkDropEventHandler*>(
+      const_cast<const InkDropHostView*>(this)->GetEventHandler());
+}
+
 BEGIN_METADATA(InkDropHostView)
 METADATA_PARENT_CLASS(View)
 END_METADATA()
diff --git a/ui/views/animation/ink_drop_host_view.h b/ui/views/animation/ink_drop_host_view.h
index fce6c3d..c410d9fb 100644
--- a/ui/views/animation/ink_drop_host_view.h
+++ b/ui/views/animation/ink_drop_host_view.h
@@ -113,6 +113,16 @@
     return ink_drop_large_corner_radius_;
   }
 
+  // Allows InstallableInkDrop to override our InkDropEventHandler
+  // instance.
+  //
+  // TODO(crbug.com/931964): Remove this, either by finishing refactor or by
+  // giving up.
+  void set_ink_drop_event_handler_override(
+      InkDropEventHandler* ink_drop_event_handler_override) {
+    ink_drop_event_handler_override_ = ink_drop_event_handler_override;
+  }
+
   // Animates |ink_drop_| to the desired |ink_drop_state|. Caches |event| as the
   // last_ripple_triggering_event().
   //
@@ -206,6 +216,9 @@
     InkDropHostView* const host_view_;
   };
 
+  const InkDropEventHandler* GetEventHandler() const;
+  InkDropEventHandler* GetEventHandler();
+
   // Defines what type of |ink_drop_| to create.
   InkDropMode ink_drop_mode_ = InkDropMode::OFF;
 
@@ -217,6 +230,8 @@
   InkDropHostViewEventHandlerDelegate ink_drop_event_handler_delegate_;
   InkDropEventHandler ink_drop_event_handler_;
 
+  InkDropEventHandler* ink_drop_event_handler_override_ = nullptr;
+
   float ink_drop_visible_opacity_ = 0.175f;
 
   // TODO(pbos): Audit call sites to make sure highlight opacity is either
diff --git a/ui/views/animation/installable_ink_drop.cc b/ui/views/animation/installable_ink_drop.cc
index 89ecb2f..3580d476 100644
--- a/ui/views/animation/installable_ink_drop.cc
+++ b/ui/views/animation/installable_ink_drop.cc
@@ -21,6 +21,7 @@
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/skia_util.h"
 #include "ui/views/animation/compositor_animation_runner.h"
+#include "ui/views/animation/ink_drop_host_view.h"
 #include "ui/views/view.h"
 #include "ui/views/view_class_properties.h"
 #include "ui/views/widget/widget.h"
@@ -63,8 +64,17 @@
   }
 }
 
+InstallableInkDrop::InstallableInkDrop(InkDropHostView* ink_drop_host_view)
+    : InstallableInkDrop(static_cast<View*>(ink_drop_host_view)) {
+  // To get all events, we must override InkDropHostView's event handler.
+  ink_drop_host_view->set_ink_drop_event_handler_override(&event_handler_);
+  ink_drop_host_view_ = ink_drop_host_view;
+}
+
 InstallableInkDrop::~InstallableInkDrop() {
   view_->RemoveLayerBeneathView(layer_.get());
+  if (ink_drop_host_view_)
+    ink_drop_host_view_->set_ink_drop_event_handler_override(nullptr);
   if (DCHECK_IS_ON())
     view_->RemoveObserver(this);
 }
diff --git a/ui/views/animation/installable_ink_drop.h b/ui/views/animation/installable_ink_drop.h
index 13d3e5f2..9bba4e3 100644
--- a/ui/views/animation/installable_ink_drop.h
+++ b/ui/views/animation/installable_ink_drop.h
@@ -32,6 +32,7 @@
 
 namespace views {
 
+class InkDropHostView;
 class View;
 
 extern const VIEWS_EXPORT base::Feature kInstallableInkDropFeature;
@@ -48,6 +49,12 @@
   // Create ink drop for |view|. Note that |view| must live longer than us.
   explicit InstallableInkDrop(View* view);
 
+  // Overload for working within the InkDropHostView hierarchy. Similar to
+  // above, |ink_drop_host_view| must outlive us.
+  //
+  // TODO(crbug.com/931964): Remove this.
+  explicit InstallableInkDrop(InkDropHostView* ink_drop_host_view);
+
   InstallableInkDrop(const InstallableInkDrop&) = delete;
   InstallableInkDrop(InstallableInkDrop&&) = delete;
 
@@ -96,6 +103,10 @@
   // visual state.
   View* const view_;
 
+  // If we were installed on an InkDropHostView, this will be non-null. We store
+  // this to to remove our InkDropEventHandler override.
+  InkDropHostView* ink_drop_host_view_ = nullptr;
+
   // The layer we paint to.
   std::unique_ptr<ui::Layer> layer_;
 
diff --git a/ui/views/controls/button/menu_button.cc b/ui/views/controls/button/menu_button.cc
index 895da043..3b073c9f 100644
--- a/ui/views/controls/button/menu_button.cc
+++ b/ui/views/controls/button/menu_button.cc
@@ -22,6 +22,11 @@
                                              CreateButtonControllerDelegate());
   menu_button_controller_ = menu_button_controller.get();
   SetButtonController(std::move(menu_button_controller));
+
+  // Triggers on button press by default, unless drag-and-drop is enabled, see
+  // MenuButtonController::IsTriggerableEventType.
+  // TODO(cyan): Investigate using PlatformStyle::kMenuNotifyActivationAction.
+  set_notify_action(Button::NOTIFY_ON_PRESS);
 }
 MenuButton::~MenuButton() = default;
 
@@ -29,10 +34,6 @@
   return button_controller()->Activate(event);
 }
 
-bool MenuButton::IsTriggerableEventType(const ui::Event& event) {
-  return button_controller()->IsTriggerableEventType(event);
-}
-
 void MenuButton::NotifyClick(const ui::Event& event) {
   // Notify MenuButtonListener via MenuButtonController, instead of
   // ButtonListener::ButtonPressed.
diff --git a/ui/views/controls/button/menu_button.h b/ui/views/controls/button/menu_button.h
index 71afb70f..d55a47526 100644
--- a/ui/views/controls/button/menu_button.h
+++ b/ui/views/controls/button/menu_button.h
@@ -41,9 +41,6 @@
 
   bool Activate(const ui::Event* event);
 
-  // TODO(cyan): Remove this method and move into MenuButtonController.
-  virtual bool IsTriggerableEventType(const ui::Event& event);
-
  protected:
   // Button:
   void NotifyClick(const ui::Event& event) final;
diff --git a/ui/views/controls/button/menu_button_controller.cc b/ui/views/controls/button/menu_button_controller.cc
index 3a741cc..2ac2b89 100644
--- a/ui/views/controls/button/menu_button_controller.cc
+++ b/ui/views/controls/button/menu_button_controller.cc
@@ -20,6 +20,17 @@
 
 namespace views {
 
+namespace {
+ui::EventType NotifyActionToMouseEventType(Button::NotifyAction notify_action) {
+  switch (notify_action) {
+    case Button::NOTIFY_ON_PRESS:
+      return ui::ET_MOUSE_PRESSED;
+    case Button::NOTIFY_ON_RELEASE:
+      return ui::ET_MOUSE_RELEASED;
+  }
+}
+}  // namespace
+
 ////////////////////////////////////////////////////////////////////////////////
 //
 // MenuButtonController::PressedLock
@@ -267,13 +278,14 @@
     // would also activate a context menu.
     if (!(mouse_event->button_flags() & button()->triggerable_event_flags()))
       return false;
-    // If dragging is supported activate on release, otherwise activate on
-    // pressed.
+
+    // Activate on release if dragging, otherwise activate based on
+    // notify_action.
     ui::EventType active_on =
-        delegate()->GetDragOperations(mouse_event->location()) ==
+        delegate()->GetDragOperations(mouse_event->location()) !=
                 ui::DragDropTypes::DRAG_NONE
-            ? ui::ET_MOUSE_PRESSED
-            : ui::ET_MOUSE_RELEASED;
+            ? ui::ET_MOUSE_RELEASED
+            : NotifyActionToMouseEventType(button()->notify_action());
     return event.type() == active_on;
   }
   return event.type() == ui::ET_GESTURE_TAP;
diff --git a/ui/views/examples/examples_main.cc b/ui/views/examples/examples_main.cc
index cb3e145a..65ba7c8 100644
--- a/ui/views/examples/examples_main.cc
+++ b/ui/views/examples/examples_main.cc
@@ -56,7 +56,7 @@
 
 int main(int argc, char** argv) {
 #if defined(OS_WIN)
-  ui::ScopedOleInitializer ole_initializer_;
+  ui::ScopedOleInitializer ole_initializer;
 #endif
 
   base::CommandLine::Init(argc, argv);
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index 6e100a7..e9182c3 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -628,6 +628,8 @@
   const ui::Layer* layer = GetLayer();
   TRACE_EVENT1("views", "Widget::Show", "layer",
                layer ? layer->name() : "none");
+  ui::WindowShowState preferred_show_state =
+      CanActivate() ? ui::SHOW_STATE_NORMAL : ui::SHOW_STATE_INACTIVE;
   if (non_client_view_) {
     // While initializing, the kiosk mode will go to full screen before the
     // widget gets shown. In that case we stay in full screen mode, regardless
@@ -644,11 +646,9 @@
     // |saved_show_state_| only applies the first time the window is shown.
     // If we don't reset the value the window may be shown maximized every time
     // it is subsequently shown after being hidden.
-    saved_show_state_ = ui::SHOW_STATE_NORMAL;
+    saved_show_state_ = preferred_show_state;
   } else {
-    native_widget_->Show(
-        CanActivate() ? ui::SHOW_STATE_NORMAL : ui::SHOW_STATE_INACTIVE,
-        gfx::Rect());
+    native_widget_->Show(preferred_show_state, gfx::Rect());
   }
 }
 
diff --git a/ui/webui/resources/cr_elements/cr_icons_css.html b/ui/webui/resources/cr_elements/cr_icons_css.html
index 4e7ea75..f3fdcfb 100644
--- a/ui/webui/resources/cr_elements/cr_icons_css.html
+++ b/ui/webui/resources/cr_elements/cr_icons_css.html
@@ -42,15 +42,6 @@
         }
       }
 
-      :-webkit-any(cr-icon-button, .cr-icon).icon-toolbar-cancel {
-        background-image: url(../images/icon_toolbar_cancel.svg);
-      }
-      @media (prefers-color-scheme: dark) {
-        :-webkit-any(cr-icon-button, .cr-icon).icon-toolbar-cancel {
-          background-image: url(../images/dark/icon_toolbar_cancel.svg);
-        }
-      }
-
       :-webkit-any(cr-icon-button, .cr-icon).icon-clear {
         background-image: url(../images/icon_clear.svg);
       }
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
index 3619422a..7d4d186 100644
--- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
+++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
@@ -5,6 +5,7 @@
 <link rel="import" href="../cr_search_field/cr_search_field_behavior.html">
 <link rel="import" href="../icons.html">
 <link rel="import" href="../shared_style_css.html">
+<link rel="import" href="../shared_vars_css.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner-lite.html">
 
 <dom-module id="cr-toolbar-search-field">
@@ -31,6 +32,15 @@
       @media (prefers-color-scheme: light) {
         cr-icon-button {
           --cr-icon-button-color: currentColor;
+          --iron-icon-fill-color:
+              var(--cr-toolbar-search-field-input-color, white);
+        }
+      }
+
+      @media (prefers-color-scheme: dark) {
+        cr-icon-button {
+          --iron-icon-fill-color: var(--cr-toolbar-search-field-input-color,
+              var(--google-grey-refresh-500));
         }
       }
 
@@ -51,7 +61,8 @@
 
       paper-spinner-lite {
         @apply --cr-icon-height-width;
-        --paper-spinner-color: white;
+        --paper-spinner-color:
+            var(--cr-toolbar-search-field-input-color, white);
         margin: 0 6px;
         opacity: 0;
         padding: 6px;
@@ -96,7 +107,7 @@
         -webkit-appearance: none;
         background: transparent;
         border: none;
-        color: white;
+        color: var(--cr-toolbar-search-field-input-color, white);
         font: inherit;
         outline: none;
         padding: 0;
@@ -111,8 +122,10 @@
 
       /** Wide layout. */
       :host(:not([narrow])) {
-        background: rgba(0, 0, 0, 0.22);
-        border-radius: 2px;
+        background:
+            var(--cr-toolbar-search-field-background, rgba(0, 0, 0, 0.22));
+        border-radius:
+            var(--cr-toolbar-search-field-border-radius, 2px);
         cursor: text;
         padding-inline-end: 0;
         width: var(--cr-toolbar-field-width, 680px);
@@ -166,7 +179,7 @@
           spellcheck="false">
     </div>
     <template is="dom-if" if="[[hasSearchText]]">
-      <cr-icon-button class="icon-toolbar-cancel" id="clearSearch"
+      <cr-icon-button id="clearSearch" iron-icon="cr:cancel"
           title="[[clearLabel]]" on-click="clearSearch_"></cr-icon-button>
     </template>
   </template>
diff --git a/ui/webui/resources/cr_elements/icons.html b/ui/webui/resources/cr_elements/icons.html
index d0648870..2679bc3d 100644
--- a/ui/webui/resources/cr_elements/icons.html
+++ b/ui/webui/resources/cr_elements/icons.html
@@ -40,6 +40,7 @@
       <g id="bluetooth"><path d="M17.71 7.71L12 2h-1v7.59L6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 11 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 5.83l1.88 1.88L13 9.59V5.83zm1.88 10.46L13 18.17v-3.76l1.88 1.88z"></path></g>
       <g id="camera-alt"><circle cx="12" cy="12" r="3.2"></circle><path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"></path></g>
 </if>
+      <g id="cancel"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"></path></g>
       <g id="check"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"></path></g>
       <g id="chevron-right"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"></path></g>
       <g id="clear"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path></g>
diff --git a/ui/webui/resources/cr_elements_images.grdp b/ui/webui/resources/cr_elements_images.grdp
index 397b634..7c12c157 100644
--- a/ui/webui/resources/cr_elements_images.grdp
+++ b/ui/webui/resources/cr_elements_images.grdp
@@ -43,9 +43,6 @@
            compress="gzip" />
   <include name="IDR_WEBUI_IMAGES_DARK_ICON_SEARCH"
            file="images/dark/icon_search.svg" type="BINDATA" compress="gzip" />
-  <include name="IDR_WEBUI_IMAGES_DARK_ICON_TOOLBAR_CANCEL"
-           file="images/dark/icon_toolbar_cancel.svg" type="BINDATA"
-           compress="gzip" />
   <include name="IDR_WEBUI_IMAGES_DARK_ICON_VISIBILITY"
            file="images/dark/icon_visibility.svg" type="BINDATA"
            compress="gzip" />
@@ -80,9 +77,6 @@
            file="images/icon_search.svg" type="BINDATA" compress="gzip" />
   <include name="IDR_WEBUI_IMAGES_ICON_SETTINGS"
            file="images/icon_settings.svg" type="BINDATA" compress="gzip" />
-  <include name="IDR_WEBUI_IMAGES_ICON_TOOLBAR_CANCEL"
-           file="images/icon_toolbar_cancel.svg" type="BINDATA"
-           compress="gzip" />
   <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY"
            file="images/icon_visibility.svg" type="BINDATA" compress="gzip" />
   <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY_OFF"
diff --git a/ui/webui/resources/images/dark/icon_toolbar_cancel.svg b/ui/webui/resources/images/dark/icon_toolbar_cancel.svg
deleted file mode 100644
index 4b22724..0000000
--- a/ui/webui/resources/images/dark/icon_toolbar_cancel.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 2 4" fill="#9aa0a6"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/></svg>
diff --git a/ui/webui/resources/images/icon_toolbar_cancel.svg b/ui/webui/resources/images/icon_toolbar_cancel.svg
deleted file mode 100644
index 9765afcf..0000000
--- a/ui/webui/resources/images/icon_toolbar_cancel.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 2 4" fill="#fff"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/></svg>
\ No newline at end of file
diff --git a/url/url_constants.cc b/url/url_constants.cc
index e39b8c5..3540240 100644
--- a/url/url_constants.cc
+++ b/url/url_constants.cc
@@ -25,6 +25,7 @@
 const char kHttpsScheme[] = "https";
 const char kJavaScriptScheme[] = "javascript";
 const char kMailToScheme[] = "mailto";
+const char kTelScheme[] = "tel";
 const char kWsScheme[] = "ws";
 const char kWssScheme[] = "wss";
 
diff --git a/url/url_constants.h b/url/url_constants.h
index 15f0190..d538e4dc 100644
--- a/url/url_constants.h
+++ b/url/url_constants.h
@@ -31,6 +31,7 @@
 COMPONENT_EXPORT(URL) extern const char kHttpsScheme[];
 COMPONENT_EXPORT(URL) extern const char kJavaScriptScheme[];
 COMPONENT_EXPORT(URL) extern const char kMailToScheme[];
+COMPONENT_EXPORT(URL) extern const char kTelScheme[];
 COMPONENT_EXPORT(URL) extern const char kWsScheme[];
 COMPONENT_EXPORT(URL) extern const char kWssScheme[];