Merge autoland to mozilla-central. a=merge
authorButkovits Atila <abutkovits@mozilla.com>
Wed, 20 Oct 2021 00:48:21 +0300
changeset 596430 e9071741b84ca6b0d07d89a0785b4d6ee527941c
parent 596429 071e79ac291629df585272854d70a2b1d47a77ab (current diff)
parent 596418 ae75b0ef474c9c5a777f42ba43150b149b5cfff1 (diff)
child 596431 31a39d410bc4d6f5e21a8897258c3b60aa150d24
child 596474 e45ba61007d1f8771179c0cc258166930acd75a5
push id151810
push userabutkovits@mozilla.com
push dateTue, 19 Oct 2021 22:09:54 +0000
treeherderautoland@31a39d410bc4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone95.0a1
first release with
nightly linux32
e9071741b84c / 95.0a1 / 20211019215100 / files
nightly linux64
e9071741b84c / 95.0a1 / 20211019215100 / files
nightly mac
e9071741b84c / 95.0a1 / 20211019215100 / files
nightly win32
e9071741b84c / 95.0a1 / 20211019215100 / files
nightly win64
e9071741b84c / 95.0a1 / 20211019215100 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge autoland to mozilla-central. a=merge
build/build-clang/clang-12-android.json
build/build-clang/clang-12-macosx64.json
build/build-clang/clang-12-win64-2stage.json
build/build-clang/clang-12-win64.json
layout/base/nsBidi.cpp
layout/base/nsBidi.h
netwerk/base/nsNetUtil.cpp
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1203,16 +1203,26 @@ pref("dom.ipc.shims.enabledWarnings", fa
   //       to ~/Library and profile directories are prevented (excluding
   //       $PROFILE/{extensions,chrome})"
   // 3 -> "no global read/write access, read access permitted to
   //       $PROFILE/{extensions,chrome}"
   // This setting is read when the content process is started. On Mac the
   // content process is killed when all windows are closed, so a change will
   // take effect when the 1st window is opened.
   pref("security.sandbox.content.level", 3);
+
+  // Disconnect content processes from the window server. Depends on
+  // out-of-process WebGL and non-native theming. i.e., both in-process WebGL
+  // and native theming depend on content processes having a connection to the
+  // window server. Window server disconnection is automatically disabled (and
+  // this pref overridden) if OOP WebGL is disabled. OOP WebGL is disabled
+  // for some tests.
+  #if defined(NIGHTLY_BUILD)
+    pref("security.sandbox.content.mac.disconnect-windowserver", true);
+  #endif
 #endif
 
 #if defined(XP_LINUX) && defined(MOZ_SANDBOX)
   // This pref is introduced as part of bug 742434, the naming is inspired from
   // its Windows/Mac counterpart, but on Linux it's an integer which means:
   // 0 -> "no sandbox"
   // 1 -> "content sandbox using seccomp-bpf when available" + ipc restrictions
   // 2 -> "seccomp-bpf + write file broker"
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -1344,25 +1344,16 @@ toolbarpaletteitem:not([place="palette"]
   animation-name: uitour-zoom;
   animation-duration: 1s;
 }
 #UITourHighlight[active="color"] {
   animation-name: uitour-color;
   animation-duration: 2s;
 }
 
-/* This effectively simulates a focus outline. */
-#UITourHighlight[active="focus-outline"] {
-  background-color: transparent;
-  border: 2px solid var(--focus-outline-color);
-  border-radius: 4px;
-
-  animation-name: none;
-}
-
 /* Combined context-menu items */
 #context-navigation > .menuitem-iconic > .menu-iconic-text,
 #context-navigation > .menuitem-iconic > .menu-accel-container {
   display: none;
 }
 
 .popup-notification-invalid-input {
   box-shadow: 0 0 1.5px 1px red;
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -84,17 +84,16 @@ XPCOMUtils.defineLazyModuleGetters(this,
   SessionStartup: "resource:///modules/sessionstore/SessionStartup.jsm",
   SessionStore: "resource:///modules/sessionstore/SessionStore.jsm",
   ShortcutUtils: "resource://gre/modules/ShortcutUtils.jsm",
   TabCrashHandler: "resource:///modules/ContentCrashHandlers.jsm",
   TabUnloader: "resource:///modules/TabUnloader.jsm",
   TelemetryUtils: "resource://gre/modules/TelemetryUtils.jsm",
   TRRRacer: "resource:///modules/TRRPerformance.jsm",
   UIState: "resource://services-sync/UIState.jsm",
-  UITour: "resource:///modules/UITour.jsm",
   UrlbarQuickSuggest: "resource:///modules/UrlbarQuickSuggest.jsm",
   UrlbarPrefs: "resource:///modules/UrlbarPrefs.jsm",
   WebChannel: "resource://gre/modules/WebChannel.jsm",
   WindowsRegistry: "resource://gre/modules/WindowsRegistry.jsm",
 });
 
 // eslint-disable-next-line no-unused-vars
 XPCOMUtils.defineLazyModuleGetters(this, {
@@ -2184,16 +2183,49 @@ BrowserGlue.prototype = {
     RemoteSettings(STUDY_ADDON_COLLECTION_KEY).on("sync", async event => {
       Services.prefs.setBoolPref(PREF_ION_NEW_STUDIES_AVAILABLE, true);
     });
 
     // When a new window opens, check if we need to badge the icon.
     Services.wm.addListener(windowListener);
   },
 
+  _monitorGPCPref() {
+    const FEATURE_PREF_ENABLED = "privacy.globalprivacycontrol.enabled";
+    const FUNCTIONALITY_PREF_ENABLED =
+      "privacy.globalprivacycontrol.functionality.enabled";
+    const PREF_WAS_ENABLED = "privacy.globalprivacycontrol.was_ever_enabled";
+    const _checkGPCPref = async () => {
+      const feature_enabled = Services.prefs.getBoolPref(
+        FEATURE_PREF_ENABLED,
+        false
+      );
+      const functionality_enabled = Services.prefs.getBoolPref(
+        FUNCTIONALITY_PREF_ENABLED,
+        false
+      );
+      const was_enabled = Services.prefs.getBoolPref(PREF_WAS_ENABLED, false);
+      let value = 0;
+      if (feature_enabled && functionality_enabled) {
+        value = 1;
+        Services.prefs.setBoolPref(PREF_WAS_ENABLED, true);
+      } else if (was_enabled) {
+        value = 2;
+      }
+      Services.telemetry.scalarSet(
+        "security.global_privacy_control_enabled",
+        value
+      );
+    };
+
+    Services.prefs.addObserver(FEATURE_PREF_ENABLED, _checkGPCPref);
+    Services.prefs.addObserver(FUNCTIONALITY_PREF_ENABLED, _checkGPCPref);
+    _checkGPCPref();
+  },
+
   // All initial windows have opened.
   _onWindowsRestored: function BG__onWindowsRestored() {
     if (this._windowsWereRestored) {
       return;
     }
     this._windowsWereRestored = true;
 
     BrowserUsageTelemetry.init();
@@ -2261,16 +2293,17 @@ BrowserGlue.prototype = {
     this._monitorScreenshotsPref();
     this._monitorWebcompatReporterPref();
     this._monitorHTTPSOnlyPref();
     this._monitorIonPref();
     this._monitorIonStudies();
     if (AppConstants.NIGHTLY_BUILD) {
       this._monitorTranslationsPref();
     }
+    this._monitorGPCPref();
   },
 
   /**
    * Use this function as an entry point to schedule tasks that
    * need to run only once after startup, and can be scheduled
    * by using an idle callback.
    *
    * The functions scheduled here will fire from idle callbacks
@@ -4066,21 +4099,20 @@ BrowserGlue.prototype = {
       message,
       "restore-session-startup-suggestion-message"
     );
 
     const buttons = [
       {
         "l10n-id": "restore-session-startup-suggestion-button",
         callback: () => {
-          UITour.getTarget(win, "history").then(historyMenu => {
-            UITour.showHighlight(win, historyMenu, "focus-outline", {
-              autohide: true,
-            });
-          });
+          win.PanelUI.selectAndMarkItem([
+            "appMenu-history-button",
+            "appMenu-restoreSession",
+          ]);
         },
       },
     ];
 
     const notifyBox = win.gBrowser.getNotificationBox();
     const notification = notifyBox.appendNotification(
       "startup-restore-session-suggestion",
       {
--- a/browser/components/customizableui/PanelMultiView.jsm
+++ b/browser/components/customizableui/PanelMultiView.jsm
@@ -1211,17 +1211,21 @@ var PanelMultiView = class extends Assoc
       case "keydown":
         // Since we start listening for the "keydown" event when the popup is
         // already showing and stop listening when the panel is hidden, we
         // always have at least one view open.
         let currentView = this.openViews[this.openViews.length - 1];
         currentView.keyNavigation(aEvent);
         break;
       case "mousemove":
-        this.openViews.forEach(panelView => panelView.clearNavigation());
+        this.openViews.forEach(panelView => {
+          if (!panelView.ignoreMouseMove) {
+            panelView.clearNavigation();
+          }
+        });
         break;
       case "popupshowing": {
         this._viewContainer.setAttribute("panelopen", "true");
         if (!this.node.hasAttribute("disablekeynav")) {
           // We add the keydown handler on the root so that it handles key
           // presses when a panel appears but doesn't get focus, as happens
           // when a button to open a panel is clicked with the mouse.
           // However, this means the listener is on an ancestor of the panel,
@@ -1802,16 +1806,18 @@ var PanelView = class extends Associated
       if (!contextNode) {
         return false;
       }
       let context = contextNode.getAttribute("context");
       let popup = this.document.getElementById(context);
       return popup && popup.state == "open";
     };
 
+    this.ignoreMouseMove = false;
+
     let keyCode = event.code;
     switch (keyCode) {
       case "ArrowDown":
       case "ArrowUp":
         if (tabOnly()) {
           break;
         }
       // Fall-through...
--- a/browser/components/customizableui/content/panelUI.js
+++ b/browser/components/customizableui/content/panelUI.js
@@ -712,16 +712,97 @@ const PanelUI = {
       return;
     }
 
     if (this.isNotificationPanelOpen) {
       this.notificationPanel.hidePopup();
     }
   },
 
+  /**
+   * Selects and marks an item by id from the main view. The ids are an array,
+   * the first in the main view and the later ids in subsequent subviews that
+   * become marked when the user opens the subview. The subview marking is
+   * cancelled if a different subview is opened.
+   */
+  async selectAndMarkItem(itemIds) {
+    // This shouldn't really occur, but return early just in case.
+    if (document.documentElement.hasAttribute("customizing")) {
+      return;
+    }
+
+    // This function was triggered from a button while the menu was
+    // already open, so the panel should be in the process of hiding.
+    // Wait for the panel to hide first, then reopen it.
+    if (this.panel.state == "hiding") {
+      await new Promise(resolve => {
+        this.panel.addEventListener("popuphidden", resolve, { once: true });
+      });
+    }
+
+    if (this.panel.state != "open") {
+      await new Promise(resolve => {
+        this.panel.addEventListener("ViewShown", resolve, { once: true });
+        this.show();
+      });
+    }
+
+    let currentView;
+
+    let viewShownCB = event => {
+      viewHidingCB();
+
+      if (itemIds.length) {
+        let subItem = window.document.getElementById(itemIds[0]);
+        if (event.target.id == subItem?.closest("panelview")?.id) {
+          Services.tm.dispatchToMainThread(() => {
+            markItem(event.target);
+          });
+        } else {
+          itemIds = [];
+        }
+      }
+    };
+
+    let viewHidingCB = () => {
+      if (currentView) {
+        currentView.ignoreMouseMove = false;
+      }
+      currentView = null;
+    };
+
+    let popupHiddenCB = () => {
+      viewHidingCB();
+      this.panel.removeEventListener("ViewShown", viewShownCB);
+    };
+
+    let markItem = viewNode => {
+      let id = itemIds.shift();
+      let item = window.document.getElementById(id);
+      item.setAttribute("tabindex", "-1");
+
+      currentView = PanelView.forNode(viewNode);
+      currentView.selectedElement = item;
+      currentView.focusSelectedElement(true);
+
+      // Prevent the mouse from changing the highlight temporarily.
+      // This flag gets removed when the view is hidden or a key
+      // is pressed.
+      currentView.ignoreMouseMove = true;
+
+      if (itemIds.length) {
+        this.panel.addEventListener("ViewShown", viewShownCB, { once: true });
+      }
+      this.panel.addEventListener("ViewHiding", viewHidingCB, { once: true });
+    };
+
+    this.panel.addEventListener("popuphidden", popupHiddenCB, { once: true });
+    markItem(this.mainView);
+  },
+
   updateNotifications(notificationsChanged) {
     let notifications = this._notifications;
     if (!notifications || !notifications.length) {
       if (notificationsChanged) {
         this._clearAllNotifications();
         this._hidePopup();
       }
       return;
--- a/browser/components/downloads/DownloadsViewUI.jsm
+++ b/browser/components/downloads/DownloadsViewUI.jsm
@@ -58,19 +58,19 @@ var gDownloadElementButtons = {
     commandName: "downloadsCmd_retry",
     l10nId: "downloads-cmd-retry",
     descriptionL10nId: "downloads-retry-download",
     panelL10nId: "downloads-cmd-retry-panel",
     iconClass: "downloadIconRetry",
   },
   show: {
     commandName: "downloadsCmd_show",
-    l10nId: "downloads-cmd-show-button",
-    descriptionL10nId: "downloads-cmd-show-description",
-    panelL10nId: "downloads-cmd-show-panel",
+    l10nId: "downloads-cmd-show-button-2",
+    descriptionL10nId: "downloads-cmd-show-description-2",
+    panelL10nId: "downloads-cmd-show-panel-2",
     iconClass: "downloadIconShow",
   },
   subviewOpenOrRemoveFile: {
     commandName: "downloadsCmd_showBlockedInfo",
     l10nId: "downloads-cmd-choose-open",
     descriptionL10nId: "downloads-show-more-information",
     panelL10nId: "downloads-cmd-choose-open-panel",
     iconClass: "downloadIconSubviewArrow",
--- a/browser/components/downloads/content/downloadsContextMenu.inc.xhtml
+++ b/browser/components/downloads/content/downloadsContextMenu.inc.xhtml
@@ -17,22 +17,17 @@
             class="downloadUseSystemDefaultMenuItem"
             data-l10n-id="downloads-cmd-use-system-default"/>
   <menuitem command="downloadsCmd_alwaysOpenInSystemViewer"
             type="checkbox"
             class="downloadAlwaysUseSystemDefaultMenuItem"
             data-l10n-id="downloads-cmd-always-use-system-default"/>
   <menuitem command="downloadsCmd_show"
             class="downloadShowMenuItem"
-#ifdef XP_MACOSX
-            data-l10n-id="downloads-cmd-show-menuitem-mac"
-#else
-            data-l10n-id="downloads-cmd-show-menuitem"
-#endif
-            />
+            data-l10n-id="downloads-cmd-show-menuitem-2"/>
 
   <menuseparator class="downloadCommandsSeparator"/>
 
   <menuitem command="downloadsCmd_openReferrer"
             data-l10n-id="downloads-cmd-go-to-download-page"/>
   <menuitem command="cmd_copy"
             data-l10n-id="downloads-cmd-copy-download-link"/>
 
--- a/browser/components/downloads/content/downloadsPanel.inc.xhtml
+++ b/browser/components/downloads/content/downloadsPanel.inc.xhtml
@@ -80,22 +80,17 @@
               class="downloadUseSystemDefaultMenuItem"
               data-l10n-id="downloads-cmd-use-system-default"/>
     <menuitem command="downloadsCmd_alwaysOpenInSystemViewer"
               type="checkbox"
               class="downloadAlwaysUseSystemDefaultMenuItem"
               data-l10n-id="downloads-cmd-always-use-system-default"/>
     <menuitem command="downloadsCmd_show"
               class="downloadShowMenuItem"
-  #ifdef XP_MACOSX
-              data-l10n-id="downloads-cmd-show-menuitem-mac"
-  #else
-              data-l10n-id="downloads-cmd-show-menuitem"
-  #endif
-              />
+              data-l10n-id="downloads-cmd-show-menuitem-2"/>
 
     <menuseparator class="downloadCommandsSeparator"/>
 
     <menuitem command="downloadsCmd_openReferrer"
               data-l10n-id="downloads-cmd-go-to-download-page"/>
     <menuitem command="downloadsCmd_copyLocation"
               data-l10n-id="downloads-cmd-copy-download-link"/>
 
--- a/browser/components/extensions/test/browser/browser.ini
+++ b/browser/components/extensions/test/browser/browser.ini
@@ -93,16 +93,18 @@ skip-if = (verify && (os == 'linux' || o
 skip-if = (webrender && debug) # bug 1553577
 [browser_ext_commands_update.js]
 [browser_ext_connect_and_move_tabs.js]
 [browser_ext_contentscript_connect.js]
 [browser_ext_contentscript_dataTransfer_files.js]
 [browser_ext_contentscript_in_parent.js]
 [browser_ext_contentscript_incognito.js]
 [browser_ext_contentscript_nontab_connect.js]
+[browser_ext_contentscript_sender_url.js]
+skip-if = debug # The nature of the reduced STR test triggers an unrelated debug assertion in DOM IPC code, see bug 1736590.
 [browser_ext_contextMenus.js]
 support-files = !/browser/components/places/tests/browser/head.js
 [browser_ext_contextMenus_checkboxes.js]
 [browser_ext_contextMenus_commands.js]
 [browser_ext_contextMenus_icons.js]
 [browser_ext_contextMenus_onclick.js]
 https_first_disabled = true
 [browser_ext_contextMenus_radioGroups.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_contentscript_sender_url.js
@@ -0,0 +1,67 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+add_task(async function test_sender_url() {
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      content_scripts: [
+        {
+          matches: ["http://mochi.test/*"],
+          run_at: "document_start",
+          js: ["script.js"],
+        },
+      ],
+    },
+
+    background() {
+      browser.runtime.onMessage.addListener((msg, sender) => {
+        browser.test.log("Message received.");
+        browser.test.sendMessage("sender.url", sender.url);
+      });
+    },
+
+    files: {
+      "script.js"() {
+        browser.test.log("Content script loaded.");
+        browser.runtime.sendMessage(0);
+      },
+    },
+  });
+
+  const image =
+    "http://mochi.test:8888/browser/browser/components/extensions/test/browser/ctxmenu-image.png";
+
+  // Bug is only visible and test only works without Fission,
+  // or with Fission but without BFcache in parent.
+  await SpecialPowers.pushPrefEnv({
+    set: [["fission.bfcacheInParent", false]],
+  });
+
+  function awaitNewTab() {
+    return BrowserTestUtils.waitForLocationChange(gBrowser, "about:newtab");
+  }
+
+  await extension.startup();
+
+  await BrowserTestUtils.withNewTab({ gBrowser }, async browser => {
+    let newTab = awaitNewTab();
+    BrowserTestUtils.loadURI(browser, "about:newtab");
+    await newTab;
+
+    BrowserTestUtils.loadURI(browser, image);
+    let url = await extension.awaitMessage("sender.url");
+    is(url, image, `Correct sender.url: ${url}`);
+
+    let wentBack = awaitNewTab();
+    await browser.goBack();
+    await wentBack;
+
+    await browser.goForward();
+    url = await extension.awaitMessage("sender.url");
+    is(url, image, `Correct sender.url: ${url}`);
+  });
+
+  await extension.unload();
+  await SpecialPowers.popPrefEnv();
+});
--- a/browser/components/extensions/test/browser/browser_ext_persistent_storage_permission_indication.js
+++ b/browser/components/extensions/test/browser/browser_ext_persistent_storage_permission_indication.js
@@ -9,25 +9,27 @@ const { PermissionTestUtils } = ChromeUt
 function openPermissionPopup() {
   let promise = BrowserTestUtils.waitForEvent(
     window,
     "popupshown",
     true,
     event => event.target == gPermissionPanel._permissionPopup
   );
   gPermissionPanel._identityPermissionBox.click();
+  info("Wait permission popup to be shown");
   return promise;
 }
 
 function closePermissionPopup() {
   let promise = BrowserTestUtils.waitForEvent(
     gPermissionPanel._permissionPopup,
     "popuphidden"
   );
   gPermissionPanel._permissionPopup.hidePopup();
+  info("Wait permission popup to be hidden");
   return promise;
 }
 
 async function testPermissionPopup({ expectPermissionHidden }) {
   await openPermissionPopup();
 
   if (expectPermissionHidden) {
     let permissionsList = document.getElementById(
@@ -62,60 +64,68 @@ async function testPermissionPopup({ exp
       "Permission Granted Icon is visible"
     );
   }
 }
 
 add_task(async function testPersistentStoragePermissionHidden() {
   let extension = ExtensionTestUtils.loadExtension({
     background() {
-      browser.test.sendMessage("url", browser.runtime.getURL("icon.png"));
+      browser.test.sendMessage("url", browser.runtime.getURL("testpage.html"));
     },
     manifest: {
       name: "Test Extension",
       permissions: ["unlimitedStorage"],
     },
     files: {
-      "icon.png": "",
+      "testpage.html": "<h1>Extension Test Page</h1>",
     },
   });
 
   await extension.startup();
 
   let url = await extension.awaitMessage("url");
-  await BrowserTestUtils.withNewTab({ gBrowser, url }, async function() {
+  await BrowserTestUtils.withNewTab("about:blank", async browser => {
+    // Wait the tab to be fully loade, then run the test on the permission prompt.
+    let loaded = BrowserTestUtils.browserLoaded(browser, false, url);
+    BrowserTestUtils.loadURI(browser, url);
+    await loaded;
     await testPermissionPopup({ expectPermissionHidden: true });
   });
 
   await extension.unload();
 });
 
 add_task(async function testPersistentStoragePermissionVisible() {
   let extension = ExtensionTestUtils.loadExtension({
     background() {
-      browser.test.sendMessage("url", browser.runtime.getURL("icon.png"));
+      browser.test.sendMessage("url", browser.runtime.getURL("testpage.html"));
     },
     manifest: {
       name: "Test Extension",
     },
     files: {
-      "icon.png": "",
+      "testpage.html": "<h1>Extension Test Page</h1>",
     },
   });
 
   await extension.startup();
 
   let url = await extension.awaitMessage("url");
 
   let policy = WebExtensionPolicy.getByID(extension.id);
   let principal = policy.extension.principal;
   PermissionTestUtils.add(
     principal,
     "persistent-storage",
     Services.perms.ALLOW_ACTION
   );
 
-  await BrowserTestUtils.withNewTab({ gBrowser, url }, async function() {
+  await BrowserTestUtils.withNewTab("about:blank", async browser => {
+    // Wait the tab to be fully loade, then run the test on the permission prompt.
+    let loaded = BrowserTestUtils.browserLoaded(browser, false, url);
+    BrowserTestUtils.loadURI(browser, url);
+    await loaded;
     await testPermissionPopup({ expectPermissionHidden: false });
   });
 
   await extension.unload();
 });
--- a/browser/components/extensions/test/xpcshell/data/test/manifest.json
+++ b/browser/components/extensions/test/xpcshell/data/test/manifest.json
@@ -58,13 +58,23 @@
         {
           "name": "locale",
           "value": "{moz:locale}"
         },
         {
           "name": "prefval",
           "condition": "pref",
           "pref": "code"
+        },
+        {
+          "name": "experimenter-1",
+          "condition": "pref",
+          "pref": "nimbus-key-1"
+        },
+        {
+          "name": "experimenter-2",
+          "condition": "pref",
+          "pref": "nimbus-key-2"
         }
       ]
     }
   }
 }
--- a/browser/components/extensions/test/xpcshell/test_ext_settings_overrides_search_mozParam.js
+++ b/browser/components/extensions/test/xpcshell/test_ext_settings_overrides_search_mozParam.js
@@ -1,20 +1,23 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 
 "use strict";
 
 const { AddonTestUtils } = ChromeUtils.import(
   "resource://testing-common/AddonTestUtils.jsm"
 );
-
 const { SearchTestUtils } = ChromeUtils.import(
   "resource://testing-common/SearchTestUtils.jsm"
 );
+const { NimbusFeatures } = ChromeUtils.import(
+  "resource://nimbus/ExperimentAPI.jsm"
+);
+const { sinon } = ChromeUtils.import("resource://testing-common/Sinon.jsm");
 
 AddonTestUtils.init(this);
 AddonTestUtils.overrideCertDB();
 AddonTestUtils.createAppInfo(
   "xpcshell@tests.mozilla.org",
   "XPCShell",
   "42",
   "42"
@@ -45,16 +48,18 @@ const params = [
   { name: "simple", value: "5" },
   { name: "term", value: "{searchTerms}" },
   { name: "lang", value: "{language}" },
   { name: "locale", value: "{moz:locale}" },
   { name: "prefval", condition: "pref", pref: "code" },
 ];
 
 add_task(async function setup() {
+  let readyStub = sinon.stub(NimbusFeatures.search, "ready").resolves();
+  let updateStub = sinon.stub(NimbusFeatures.search, "onUpdate");
   await promiseStartupManager();
   await SearchTestUtils.useTestEngines("data", null, [
     {
       webExtension: {
         id: "test@search.mozilla.org",
       },
       appliesTo: [
         {
@@ -62,16 +67,18 @@ add_task(async function setup() {
           default: "yes",
         },
       ],
     },
   ]);
   await Services.search.init();
   registerCleanupFunction(async () => {
     await promiseShutdownManager();
+    readyStub.restore();
+    updateStub.restore();
   });
 });
 
 /* This tests setting moz params. */
 add_task(async function test_extension_setting_moz_params() {
   let defaultBranch = Services.prefs.getDefaultBranch("browser.search.");
   defaultBranch.setCharPref("param.code", "good");
 
@@ -100,16 +107,91 @@ add_task(async function test_extension_s
       p.condition == "purpose" ? p.purpose : null
     ).uri.spec;
     equal(
       expectedURL,
       `https://example.com/?q=test&${p.name}=${p.value}&${paramStr}`,
       "search url is expected"
     );
   }
+
+  defaultBranch.setCharPref("param.code", "");
+});
+
+add_task(async function test_nimbus_params() {
+  let sandbox = sinon.createSandbox();
+  let stub = sandbox.stub(NimbusFeatures.search, "getVariable");
+  // These values should match the nimbusParams below and the data/test/manifest.json
+  // search engine configuration
+  stub.withArgs("extraParams").returns([
+    {
+      key: "nimbus-key-1",
+      value: "nimbus-value-1",
+    },
+    {
+      key: "nimbus-key-2",
+      value: "nimbus-value-2",
+    },
+  ]);
+
+  Assert.ok(
+    NimbusFeatures.search.onUpdate.called,
+    "Called to initialize the cache"
+  );
+
+  // Populate the cache with the `getVariable` mock values
+  NimbusFeatures.search.onUpdate.firstCall.args[0]();
+
+  let engine = Services.search.getEngineByName("MozParamsTest");
+
+  // Note: these lists should be kept in sync with the lists in
+  // browser/components/extensions/test/xpcshell/data/test/manifest.json
+  // These params are conditional based on how search is initiated.
+  const nimbusParams = [
+    { name: "experimenter-1", condition: "pref", pref: "nimbus-key-1" },
+    { name: "experimenter-2", condition: "pref", pref: "nimbus-key-2" },
+  ];
+  const experimentCache = {
+    "nimbus-key-1": "nimbus-value-1",
+    "nimbus-key-2": "nimbus-value-2",
+  };
+
+  let extraParams = [];
+  for (let p of params) {
+    if (p.value == "{searchTerms}") {
+      extraParams.push(`${p.name}=test`);
+    } else if (p.value == "{language}") {
+      extraParams.push(`${p.name}=${Services.locale.requestedLocale || "*"}`);
+    } else if (p.value == "{moz:locale}") {
+      extraParams.push(`${p.name}=${Services.locale.requestedLocale}`);
+    } else if (p.condition !== "pref") {
+      // Ignoring pref parameters
+      extraParams.push(`${p.name}=${p.value}`);
+    }
+  }
+  for (let p of nimbusParams) {
+    if (p.condition == "pref") {
+      extraParams.push(`${p.name}=${experimentCache[p.pref]}`);
+    }
+  }
+  let paramStr = extraParams.join("&");
+  for (let p of mozParams) {
+    let expectedURL = engine.getSubmission(
+      "test",
+      null,
+      p.condition == "purpose" ? p.purpose : null
+    ).uri.spec;
+    equal(
+      expectedURL,
+      `https://example.com/?q=test&${p.name}=${p.value}&${paramStr}`,
+      "search url is expected"
+    );
+  }
+
+  sandbox.restore();
 });
 
 add_task(async function test_extension_setting_moz_params_fail() {
   // Ensure that the test infra does not automatically make
   // this privileged.
   AddonTestUtils.usePrivilegedSignatures = false;
   Services.prefs.setCharPref(
     "extensions.installedDistroAddon.test@mochitest",
--- a/browser/components/search/test/browser/browser_search_nimbus_reload.js
+++ b/browser/components/search/test/browser/browser_search_nimbus_reload.js
@@ -11,43 +11,46 @@ const { NimbusFeatures } = ChromeUtils.i
 );
 const { SearchService } = ChromeUtils.import(
   "resource://gre/modules/SearchService.jsm"
 );
 const { sinon } = ChromeUtils.import("resource://testing-common/Sinon.jsm");
 
 add_task(async function test_engines_reloaded_nimbus() {
   let reloadSpy = sinon.spy(SearchService.prototype, "_maybeReloadEngines");
-  let variableSpy = sinon.spy(NimbusFeatures.search, "getVariable");
+  let getVariableSpy = sinon.spy(NimbusFeatures.search, "getVariable");
 
   let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
     featureId: "search",
     value: { experiment: "nimbus-search-mochitest" },
   });
 
   Assert.equal(reloadSpy.callCount, 1, "Called by experiment enrollment");
   await BrowserTestUtils.waitForCondition(
-    () => variableSpy.called,
+    () => getVariableSpy.calledWith("experiment"),
     "Wait for SearchService update to run"
   );
   Assert.equal(
-    variableSpy.callCount,
-    1,
-    "Called by update function to fetch engines"
+    getVariableSpy.callCount,
+    2,
+    "Called by update function to fetch engines and by ParamPreferenceCache"
   );
-  Assert.equal(
-    variableSpy.firstCall.args[0],
-    "experiment",
-    "Got `experiment` variable value"
+  Assert.ok(
+    getVariableSpy.calledWith("extraParams"),
+    "Called by ParamPreferenceCache listener"
+  );
+  Assert.ok(
+    getVariableSpy.calledWith("experiment"),
+    "Called by search service observer"
   );
   Assert.equal(
     NimbusFeatures.search.getVariable("experiment"),
     "nimbus-search-mochitest",
     "Should have expected value"
   );
 
   await doExperimentCleanup();
 
   Assert.equal(reloadSpy.callCount, 2, "Called by experiment unenrollment");
 
   reloadSpy.restore();
-  variableSpy.restore();
+  getVariableSpy.restore();
 });
--- a/browser/components/uitour/UITour.jsm
+++ b/browser/components/uitour/UITour.jsm
@@ -146,24 +146,16 @@ var UITour = {
       "forget",
       {
         allowAdd: true,
         query: "#panic-button",
         widgetName: "panic-button",
       },
     ],
     ["help", { query: "#appMenu-help-button2" }],
-    [
-      "history",
-      {
-        query: "#appMenu-history-button",
-        subItem: "restorePreviousSession",
-        level: "top",
-      },
-    ],
     ["home", { query: "#home-button" }],
     [
       "logins",
       {
         query: "#appMenu-passwords-button",
       },
     ],
     [
@@ -181,17 +173,16 @@ var UITour = {
     ],
     [
       "quit",
       {
         query: "#appMenu-quit-button2",
       },
     ],
     ["readerMode-urlBar", { query: "#reader-mode-button" }],
-    ["restorePreviousSession", { query: "#appMenu-restoreSession" }],
     [
       "search",
       {
         infoPanelOffsetX: 18,
         infoPanelPosition: "after_start",
         query: "#searchbar",
         widgetName: "search-container",
       },
@@ -831,46 +822,44 @@ var UITour = {
     let openTourBrowsers = this.tourBrowsersByWindow.get(aWindow);
     if (aTourPageClosing && openTourBrowsers) {
       openTourBrowsers.delete(aBrowser);
     }
 
     this.hideHighlight(aWindow);
     this.hideInfo(aWindow);
 
-    await this.removePanelListeners(aWindow, true);
+    await this.removePanelListeners(aWindow);
 
     this.noautohideMenus.clear();
 
     // If there are no more tour tabs left in the window, teardown the tour for the whole window.
     if (!openTourBrowsers || openTourBrowsers.size == 0) {
       this.teardownTourForWindow(aWindow);
     }
   },
 
   /**
    * Remove the listeners to a panel when tearing the tour down.
    */
-  async removePanelListeners(aWindow, aHidePanels = false) {
+  async removePanelListeners(aWindow) {
     let panels = [
       {
         name: "appMenu",
         node: aWindow.PanelUI.panel,
         events: [
           ["popuphidden", this.onPanelHidden],
           ["popuphiding", this.onAppMenuHiding],
           ["ViewShowing", this.onAppMenuSubviewShowing],
-          ["ViewShown", this.onAppMenuSubviewShown],
-          ["ViewHiding", this.onAppMenuSubviewHiding],
         ],
       },
     ];
     for (let panel of panels) {
       // Ensure the menu panel is hidden and clean up panel listeners after calling hideMenu.
-      if (aHidePanels && panel.node.state != "closed") {
+      if (panel.node.state != "closed") {
         await new Promise(resolve => {
           panel.node.addEventListener("popuphidden", resolve, { once: true });
           this.hideMenu(aWindow, panel.name);
         });
       }
       for (let [name, listener] of panel.events) {
         panel.node.removeEventListener(name, listener);
       }
@@ -973,18 +962,16 @@ var UITour = {
             infoPanelOffsetX: targetObject.infoPanelOffsetX,
             infoPanelOffsetY: targetObject.infoPanelOffsetY,
             infoPanelPosition: targetObject.infoPanelPosition,
             node,
             removeTargetListener: targetObject.removeTargetListener,
             targetName: aTargetName,
             widgetName: targetObject.widgetName,
             allowAdd: targetObject.allowAdd,
-            level: targetObject.level,
-            subItem: targetObject.subItem,
           });
         })
         .catch(log.error);
     });
   },
 
   targetIsInAppMenu(aTarget) {
     let targetElement = aTarget.node;
@@ -1132,26 +1119,16 @@ var UITour = {
       }
       // Toggle the effect attribute to "none" and flush layout before setting it so the effect plays.
       highlighter.setAttribute("active", "none");
       aChromeWindow.getComputedStyle(highlighter).animationName;
       highlighter.setAttribute("active", effect);
       highlighter.parentElement.setAttribute("targetName", aTarget.targetName);
       highlighter.parentElement.hidden = false;
 
-      if (aTarget.subItem) {
-        // This is a subitem in the app menu, so mark it as one not to hide.
-        this.noautohideMenus.add("appMenu");
-        highlighter.parentElement.setAttribute("subitem", aTarget.subItem);
-      }
-
-      if (aTarget.level) {
-        highlighter.parentElement.setAttribute("level", aTarget.level);
-      }
-
       let highlightAnchor = aAnchorEl;
       let targetRect = highlightAnchor.getBoundingClientRect();
       let highlightHeight = targetRect.height;
       let highlightWidth = targetRect.width;
 
       if (this.targetIsInAppMenu(aTarget)) {
         highlighter.classList.remove("rounded-highlight");
       } else {
@@ -1437,35 +1414,31 @@ var UITour = {
 
     if (aMenuName == "appMenu") {
       let menu = {
         onPanelHidden: this.onPanelHidden,
       };
       menu.node = aWindow.PanelUI.panel;
       menu.onPopupHiding = this.onAppMenuHiding;
       menu.onViewShowing = this.onAppMenuSubviewShowing;
-      menu.onViewShown = this.onAppMenuSubviewShown;
-      menu.onViewHiding = this.onAppMenuSubviewHiding;
       menu.show = () => aWindow.PanelUI.show();
 
       if (!aOptions.autohide) {
         menu.node.setAttribute("noautohide", "true");
       }
       // If the popup is already opened, don't recreate the widget as it may cause a flicker.
       if (menu.node.state != "open") {
         this.recreatePopup(menu.node);
       }
       if (aOpenCallback) {
         menu.node.addEventListener("popupshown", aOpenCallback, { once: true });
       }
       menu.node.addEventListener("popuphidden", menu.onPanelHidden);
       menu.node.addEventListener("popuphiding", menu.onPopupHiding);
       menu.node.addEventListener("ViewShowing", menu.onViewShowing);
-      menu.node.addEventListener("ViewShown", menu.onViewShown);
-      menu.node.addEventListener("ViewHiding", menu.onViewHiding);
       menu.show();
     } else if (aMenuName == "bookmarks") {
       let menuBtn = aWindow.document.getElementById("bookmarks-menu-button");
       openMenuButton(menuBtn);
     } else if (aMenuName == "pocket") {
       let button = aWindow.document.getElementById("save-to-pocket-button");
       if (!button) {
         log.error("Can't open the pocket menu without a button");
@@ -1584,90 +1557,22 @@ var UITour = {
   onAppMenuHiding(aEvent) {
     UITour._hideAnnotationsForPanel(aEvent, true, UITour.targetIsInAppMenu);
   },
 
   onAppMenuSubviewShowing(aEvent) {
     UITour._hideAnnotationsForPanel(aEvent, false, UITour.targetIsInAppMenu);
   },
 
-  onAppMenuSubviewShown(aEvent) {
-    let win = aEvent.target.ownerGlobal;
-    let subItemName = UITour.getSubItem(win);
-    if (
-      subItemName &&
-      UITour.isSubItemToHighlight(win, subItemName, aEvent.target.id)
-    ) {
-      let highlighter = UITour.getHighlightAndMaybeCreate(win.document);
-      UITour.recreatePopup(highlighter.parentElement);
-
-      UITour.getTarget(win, subItemName).then(subItem => {
-        if (!subItem.node.hidden) {
-          UITour.showHighlight(win, subItem, "focus-outline", {
-            autohide: true,
-          });
-        }
-      });
-    } else if (subItemName && aEvent.target.id != "appMenu-protonMainView") {
-      UITour.stopSubViewHandling(win);
-    }
-  },
-
-  onAppMenuSubviewHiding(aEvent) {
-    let win = aEvent.target.ownerGlobal;
-
-    let subItem = UITour.getSubItem(win);
-    if (subItem) {
-      if (UITour.isSubItemToHighlight(win, subItem, aEvent.target.id)) {
-        UITour.hideHighlight(win);
-        UITour.stopSubViewHandling(win);
-      }
-    }
-  },
-
   onPanelHidden(aEvent) {
-    if (UITour.getSubItem(aEvent.target.ownerGlobal)) {
-      UITour.stopSubViewHandling(aEvent.target.ownerGlobal);
-    }
-
     aEvent.target.removeAttribute("noautohide");
     UITour.recreatePopup(aEvent.target);
     UITour.clearAvailableTargetsCache();
   },
 
-  getSubItem(aWindow) {
-    // Get the subitem that should be highlighted in the app menu's subview.
-    let highlighter = UITour.getHighlightContainerAndMaybeCreate(
-      aWindow.document
-    );
-    return highlighter.getAttribute("subitem");
-  },
-
-  isSubItemToHighlight(aWindow, aSubItem, aExpectedId) {
-    let targetObject = UITour.targets.get(aSubItem);
-    if (targetObject) {
-      let node = UITour.getNodeFromDocument(
-        aWindow.document,
-        targetObject.query
-      );
-      return aExpectedId == node?.closest("panelview")?.id;
-    }
-
-    return false;
-  },
-
-  stopSubViewHandling(aWindow) {
-    UITour.removePanelListeners(aWindow);
-    UITour.noautohideMenus.delete("appMenu");
-
-    let highlighter = UITour.getHighlightAndMaybeCreate(aWindow.document);
-    highlighter.parentElement.removeAttribute("level");
-    highlighter.parentElement.removeAttribute("subitem");
-  },
-
   recreatePopup(aPanel) {
     // After changing popup attributes that relate to how the native widget is created
     // (e.g. @noautohide) we need to re-create the frame/widget for it to take effect.
     if (aPanel.hidden) {
       // If the panel is already hidden, we don't need to recreate it but flush
       // in case someone just hid it.
       aPanel.clientWidth; // flush
       return;
--- a/browser/components/uitour/test/browser_UITour_availableTargets.js
+++ b/browser/components/uitour/test/browser_UITour_availableTargets.js
@@ -10,24 +10,22 @@ requestLongerTimeout(2);
 
 function getExpectedTargets() {
   return [
     "accountStatus",
     "addons",
     "appMenu",
     "backForward",
     "help",
-    "history",
     "logins",
     "pageAction-bookmark",
     ...(hasPocket ? ["pocket"] : []),
     "privateWindow",
     ...(hasQuit ? ["quit"] : []),
     "readerMode-urlBar",
-    "restorePreviousSession",
     "urlbar",
   ];
 }
 
 add_task(setup_UITourTest);
 
 add_UITour_task(async function test_availableTargets() {
   let data = await getConfigurationPromise("availableTargets");
--- a/browser/locales/en-US/browser/downloads.ftl
+++ b/browser/locales/en-US/browser/downloads.ftl
@@ -24,49 +24,46 @@ downloads-cmd-pause =
 downloads-cmd-resume =
     .label = Resume
     .accesskey = R
 downloads-cmd-cancel =
     .tooltiptext = Cancel
 downloads-cmd-cancel-panel =
     .aria-label = Cancel
 
-# This message is only displayed on Windows and Linux devices
-downloads-cmd-show-menuitem =
-  .label = Open Containing Folder
-  .accesskey = F
-
-# This message is only displayed on macOS devices
-downloads-cmd-show-menuitem-mac =
-  .label = Show In Finder
+downloads-cmd-show-menuitem-2 =
+  .label = { PLATFORM() ->
+      [macos] Show in Finder
+     *[other] Show in Folder
+  }
   .accesskey = F
 
 downloads-cmd-use-system-default =
   .label = Open In System Viewer
   .accesskey = V
 
 downloads-cmd-always-use-system-default =
   .label = Always Open In System Viewer
   .accesskey = w
 
-downloads-cmd-show-button =
+downloads-cmd-show-button-2 =
   .tooltiptext = { PLATFORM() ->
-      [macos] Show In Finder
-     *[other] Open Containing Folder
+      [macos] Show in Finder
+     *[other] Show in Folder
   }
 
-downloads-cmd-show-panel =
+downloads-cmd-show-panel-2 =
   .aria-label = { PLATFORM() ->
-      [macos] Show In Finder
-     *[other] Open Containing Folder
+      [macos] Show in Finder
+     *[other] Show in Folder
   }
-downloads-cmd-show-description =
+downloads-cmd-show-description-2 =
   .value = { PLATFORM() ->
-      [macos] Show In Finder
-     *[other] Open Containing Folder
+      [macos] Show in Finder
+     *[other] Show in Folder
   }
 
 downloads-cmd-show-downloads =
     .label = Show downloads folder
 downloads-cmd-retry =
     .tooltiptext = Retry
 downloads-cmd-retry-panel =
     .aria-label = Retry
--- a/browser/locales/en-US/chrome/browser/downloads/downloads.properties
+++ b/browser/locales/en-US/chrome/browser/downloads/downloads.properties
@@ -77,22 +77,8 @@ statusSeparator=%1$S \u2014 %2$S
 statusSeparatorBeforeNumber=%1$S \u2014  %2$S
 
 # LOCALIZATION NOTE (otherDownloads3):
 # This is displayed in an item at the bottom of the Downloads Panel when
 # there are more downloads than can fit in the list in the panel. Use a
 # semi-colon list of plural forms.
 # See: http://developer.mozilla.org/en/Localization_and_Plurals
 otherDownloads3=%1$S file downloading;%1$S files downloading
-
-# LOCALIZATION NOTE (showLabel, showMacLabel):
-# This is displayed when you hover a download item in the Library widget view.
-# showMacLabel is only shown on Mac OSX.
-showLabel=Open Containing Folder
-showMacLabel=Open In Finder
-# LOCALIZATION NOTE (openFileLabel):
-# Displayed when hovering a complete download, indicates that it's possible to
-# open the file using an app available in the system.
-openFileLabel=Open File
-# LOCALIZATION NOTE (retryLabel):
-# Displayed when hovering a download which is able to be retried by users,
-# indicates that it's possible to download this file again.
-retryLabel=Retry Download
--- a/devtools/client/framework/test/browser_target_parents.js
+++ b/devtools/client/framework/test/browser_target_parents.js
@@ -15,18 +15,19 @@ add_task(async function() {
   const tab = await addTab(TEST_URL);
 
   const client = await setupDebuggerClient();
   const mainRoot = client.mainRoot;
 
   const tabDescriptors = await mainRoot.listTabs();
 
   await testGetTargetWithConcurrentCalls(tabDescriptors, tabTarget => {
-    // Tab Target is attached when it has a console front.
-    return !!tabTarget.getCachedFront("console");
+    // We only call BrowsingContextTargetFront.attach and not TargetMixin.attachAndInitThread.
+    // So very few things are done.
+    return !!tabTarget.traits;
   });
 
   await client.close();
   await removeTab(tab);
 });
 
 // Test against Process targets
 add_task(async function() {
@@ -35,18 +36,19 @@ add_task(async function() {
 
   const processes = await mainRoot.listProcesses();
 
   // Assert that concurrent calls to getTarget resolves the same target and that it is already attached
   // With that, we were chasing a precise race, where a second call to ProcessDescriptor.getTarget()
   // happens between the instantiation of ContentProcessTarget and its call to attach() from getTarget
   // function.
   await testGetTargetWithConcurrentCalls(processes, processTarget => {
-    // Content Process Target is attached when it has a console front.
-    return !!processTarget.getCachedFront("console");
+    // We only call ContentProcessTargetFront.attach and not TargetMixin.attachAndInitThread.
+    // So nothing is done for content process targets.
+    return true;
   });
 
   await client.close();
 });
 
 // Test against Webextension targets
 add_task(async function() {
   const client = await setupDebuggerClient();
--- a/devtools/client/framework/toolbox.js
+++ b/devtools/client/framework/toolbox.js
@@ -686,17 +686,18 @@ Toolbox.prototype = {
       if (isTargetSwitching) {
         // Notify gDevTools that the toolbox will be hooked to another target.
         this.emit("switch-target", targetFront);
       }
 
       // Attach to a new top-level target.
       // For now, register these event listeners only on the top level target
       targetFront.on("frame-update", this._updateFrames);
-      targetFront.on("inspect-object", this._onInspectObject);
+      const consoleFront = await targetFront.getFront("console");
+      consoleFront.on("inspectObject", this._onInspectObject);
     }
 
     // Walker listeners allow to monitor DOM Mutation breakpoint updates.
     // All targets should be monitored.
     targetFront.watchFronts("inspector", async inspectorFront => {
       registerWalkerListeners(this.store, inspectorFront.walker);
     });
 
@@ -713,18 +714,19 @@ Toolbox.prototype = {
         return;
       }
       await this.initPerformance();
     }
   },
 
   _onTargetDestroyed({ targetFront }) {
     if (targetFront.isTopLevel) {
-      this.target.off("inspect-object", this._onInspectObject);
-      this.target.off("frame-update", this._updateFrames);
+      const consoleFront = targetFront.getCachedFront("console");
+      consoleFront.off("inspectObject", this._onInspectObject);
+      targetFront.off("frame-update", this._updateFrames);
     } else if (this.selection) {
       this.selection.onTargetDestroyed(targetFront);
     }
 
     if (this.hostType !== Toolbox.HostType.PAGE) {
       this.store.dispatch(unregisterTarget(targetFront));
     }
   },
@@ -3606,31 +3608,34 @@ Toolbox.prototype = {
     this.emit("selection-changed");
 
     const targetFrontActorID = this.selection?.nodeFront?.targetFront?.actorID;
     if (targetFrontActorID) {
       this.selectTarget(targetFrontActorID);
     }
   },
 
-  _onInspectObject: function(packet) {
-    this.inspectObjectActor(packet.objectActor, packet.inspectFromAnnotation);
-  },
-
   _onToolSelected: function() {
     this._refreshHostTitle();
 
     this.updatePickerButton();
     this.updateFrameButton();
     this.updateErrorCountButton();
 
     // Calling setToolboxButtons in case the visibility of a button changed.
     this.component.setToolboxButtons(this.toolbarButtons);
   },
 
+  /**
+   * Listener for "inspectObject" event on console top level target actor.
+   */
+  _onInspectObject(packet) {
+    this.inspectObjectActor(packet.objectActor, packet.inspectFromAnnotation);
+  },
+
   inspectObjectActor: async function(objectActor, inspectFromAnnotation) {
     const objectGrip = objectActor?.getGrip
       ? objectActor.getGrip()
       : objectActor;
 
     if (
       objectGrip.preview &&
       objectGrip.preview.nodeType === domNodeConstants.ELEMENT_NODE
--- a/devtools/client/fronts/descriptors/worker.js
+++ b/devtools/client/fronts/descriptors/worker.js
@@ -90,26 +90,24 @@ class WorkerDescriptorFront extends Desc
       this._url = response.url;
 
       if (this.isDestroyedOrBeingDestroyed()) {
         return this;
       }
 
       const workerTargetForm = await super.getTarget();
 
-      // Set the console actor ID on the form to expose it to Target.attachConsole
-      // Set the ThreadActor on the target form so it is accessible by getFront
+      // Set the console and thread actor IDs on the form so it is accessible by TargetMixin.getFront
       this.targetForm.consoleActor = workerTargetForm.consoleActor;
       this.targetForm.threadActor = workerTargetForm.threadActor;
 
       if (this.isDestroyedOrBeingDestroyed()) {
         return this;
       }
 
-      await this.attachConsole();
       return this;
     })();
     return this._attach;
   }
 
   async detach() {
     try {
       await super.detach();
--- a/devtools/client/fronts/targets/content-process.js
+++ b/devtools/client/fronts/targets/content-process.js
@@ -39,21 +39,16 @@ class ContentProcessTargetFront extends 
         "webIsolated=",
         ""
       )}`;
     }
     return `(pid ${this.processID}) Content Process`;
   }
 
   attach() {
-    // All target actors have a console actor to attach.
-    // All but xpcshell test actors... which is using a ContentProcessTargetActor
-    if (this.targetForm.consoleActor) {
-      return this.attachConsole();
-    }
     return Promise.resolve();
   }
 
   reconfigure() {
     // Toolbox and options panel are calling this method but Worker Target can't be
     // reconfigured. So we ignore this call here.
     return Promise.resolve();
   }
--- a/devtools/client/fronts/targets/target-mixin.js
+++ b/devtools/client/fronts/targets/target-mixin.js
@@ -463,35 +463,16 @@ function TargetMixin(parentClass) {
         }
         return parsedURL.pathname;
       } catch (e) {
         // Return the url if unable to resolve the pathname.
         return url;
       }
     }
 
-    // Attach the console actor
-    async attachConsole() {
-      const consoleFront = await this.getFront("console");
-
-      if (this.isDestroyedOrBeingDestroyed()) {
-        return;
-      }
-
-      // Calling startListeners will populate the traits as it's the first request we
-      // make to the front.
-      await consoleFront.startListeners([]);
-
-      this._onInspectObject = packet => this.emit("inspect-object", packet);
-      this.removeOnInspectObjectListener = consoleFront.on(
-        "inspectObject",
-        this._onInspectObject
-      );
-    }
-
     /**
      * This method attaches the target and then attaches its related thread, sending it
      * the options it needs (e.g. breakpoints, pause on exception setting, …).
      * This function can be called multiple times, it will only perform the actual
      * initialization process once; on subsequent call the original promise (_onThreadInitialized)
      * will be returned.
      *
      * @param {TargetCommand} targetCommand
@@ -644,22 +625,16 @@ function TargetMixin(parentClass) {
           }
           front.destroy();
         } catch (e) {
           console.warn("Error while destroying front:", name, e);
         }
       }
       this.fronts.clear();
 
-      // Remove listeners set in attachConsole
-      if (this.removeOnInspectObjectListener) {
-        this.removeOnInspectObjectListener();
-        this.removeOnInspectObjectListener = null;
-      }
-
       this.threadFront = null;
       this._offResourceEvent = null;
 
       // This event should be emitted before calling super.destroy(), because
       // super.destroy() will remove all event listeners attached to this front.
       this.emit("target-destroyed");
 
       // Not all targets supports attach/detach. For example content process doesn't.
--- a/devtools/client/fronts/targets/window-global.js
+++ b/devtools/client/fronts/targets/window-global.js
@@ -120,22 +120,16 @@ class WindowGlobalTargetFront extends Ta
 
       const response = await super.attach();
 
       this.targetForm.threadActor = response.threadActor;
 
       // @backward-compat { version 93 } Remove this. All the traits are on form and can be accessed
       // using getTraits.
       this.traits = response.traits || {};
-
-      // xpcshell tests from devtools/server/tests/xpcshell/ are implementing
-      // fake WindowGlobalTargetActor which do not expose any console actor.
-      if (this.targetForm.consoleActor) {
-        await this.attachConsole();
-      }
     })();
     return this._attach;
   }
 
   async detach() {
     // When calling this.destroy() at the end of this method,
     // we will end up calling detach again from TargetMixin.destroy.
     // Avoid invalid loops and do not try to resolve only once the previous call to detach
--- a/devtools/client/fronts/webconsole.js
+++ b/devtools/client/fronts/webconsole.js
@@ -19,17 +19,16 @@ const {
  *
  * @param object client
  *        The DevToolsClient instance we live for.
  */
 class WebConsoleFront extends FrontClassWithSpec(webconsoleSpec) {
   constructor(client, targetFront, parentFront) {
     super(client, targetFront, parentFront);
     this._client = client;
-    this.traits = {};
     this.events = [];
 
     // Attribute name from which to retrieve the actorID out of the target actor's form
     this.formAttributeName = "consoleActor";
 
     this._onNetworkEventUpdate = this._onNetworkEventUpdate.bind(this);
 
     this.before("consoleAPICall", this.beforeConsoleAPICall);
@@ -301,17 +300,16 @@ class WebConsoleFront extends FrontClass
    *        Array of listeners you want to start. See this.LISTENERS for
    *        known listeners.
    * @return request
    *         Request object that implements both Promise and EventEmitter interfaces
    */
   async startListeners(listeners) {
     const response = await super.startListeners(listeners);
     this.hasNativeConsoleAPI = response.nativeConsoleAPI;
-    this.traits = response.traits;
     return response;
   }
 
   /**
    * Close the WebConsoleFront.
    *
    */
   destroy() {
--- a/devtools/client/netmonitor/src/connector/index.js
+++ b/devtools/client/netmonitor/src/connector/index.js
@@ -427,19 +427,16 @@ class Connector {
 
   /*
    * Get the list of blocked URLs
    */
   async getBlockedUrls() {
     if (this.hasResourceCommandSupport && this.networkFront) {
       return this.networkFront.getBlockedUrls();
     }
-    if (!this.webConsoleFront.traits.blockedUrls) {
-      return [];
-    }
     return this.webConsoleFront.getBlockedUrls();
   }
 
   async updatePersist() {
     const enabled = Services.prefs.getBoolPref(
       DEVTOOLS_ENABLE_PERSISTENT_LOG_PREF
     );
 
--- a/devtools/client/shared/test/browser_dbg_listtabs-01.js
+++ b/devtools/client/shared/test/browser_dbg_listtabs-01.js
@@ -8,103 +8,73 @@
  */
 
 var { DevToolsServer } = require("devtools/server/devtools-server");
 var { DevToolsClient } = require("devtools/client/devtools-client");
 
 const TAB1_URL = EXAMPLE_URL + "doc_empty-tab-01.html";
 const TAB2_URL = EXAMPLE_URL + "doc_empty-tab-02.html";
 
-var gTab1, gTab1Front, gTab2, gTab2Front, gClient;
-
-function test() {
+add_task(async function test() {
   DevToolsServer.init();
   DevToolsServer.registerAllActors();
 
   const transport = DevToolsServer.connectPipe();
-  gClient = new DevToolsClient(transport);
-  gClient.connect().then(([aType, aTraits]) => {
-    is(aType, "browser", "Root actor should identify itself as a browser.");
+  const client = new DevToolsClient(transport);
+  const [aType] = await client.connect();
+  is(aType, "browser", "Root actor should identify itself as a browser.");
 
-    Promise.resolve(null)
-      .then(testFirstTab)
-      .then(testSecondTab)
-      .then(testRemoveTab)
-      .then(testAttachRemovedTab)
-      .then(() => gClient.close())
-      .then(finish)
-      .catch(error => {
-        ok(false, "Got an error: " + error.message + "\n" + error.stack);
-      });
-  });
+  const firstTab = await testFirstTab(client);
+  const secondTab = await testSecondTab(client, firstTab.front);
+  await testRemoveTab(client, firstTab.tab);
+  await testAttachRemovedTab(secondTab.tab, secondTab.front);
+  await client.close();
+});
+
+async function testFirstTab(client) {
+  const tab = await addTab(TAB1_URL);
+
+  const front = await getDescriptorActorForUrl(client, TAB1_URL);
+  ok(front, "Should find a target actor for the first tab.");
+  return { tab, front };
 }
 
-function testFirstTab() {
-  return addTab(TAB1_URL).then(tab => {
-    gTab1 = tab;
-
-    return getTargetActorForUrl(gClient, TAB1_URL).then(front => {
-      ok(front, "Should find a target actor for the first tab.");
-      gTab1Front = front;
-    });
-  });
-}
+async function testSecondTab(client, firstTabFront) {
+  const tab = await addTab(TAB2_URL);
 
-function testSecondTab() {
-  return addTab(TAB2_URL).then(tab => {
-    gTab2 = tab;
-
-    return getTargetActorForUrl(gClient, TAB1_URL).then(firstFront => {
-      return getTargetActorForUrl(gClient, TAB2_URL).then(secondFront => {
-        is(firstFront, gTab1Front, "First tab's actor shouldn't have changed.");
-        ok(secondFront, "Should find a target actor for the second tab.");
-        gTab2Front = secondFront;
-      });
-    });
-  });
+  const firstFront = await getDescriptorActorForUrl(client, TAB1_URL);
+  const secondFront = await getDescriptorActorForUrl(client, TAB2_URL);
+  is(firstFront, firstTabFront, "First tab's actor shouldn't have changed.");
+  ok(secondFront, "Should find a target actor for the second tab.");
+  return { tab, front: secondFront };
 }
 
-function testRemoveTab() {
-  return removeTab(gTab1).then(() => {
-    return getTargetActorForUrl(gClient, TAB1_URL).then(front => {
-      ok(!front, "Shouldn't find a target actor for the first tab anymore.");
-    });
-  });
+async function testRemoveTab(client, firstTab) {
+  await removeTab(firstTab);
+  const front = await getDescriptorActorForUrl(client, TAB1_URL);
+  ok(!front, "Shouldn't find a target actor for the first tab anymore.");
 }
 
-function testAttachRemovedTab() {
-  return removeTab(gTab2).then(() => {
-    return new Promise((resolve, reject) => {
-      gClient.on("paused", () => {
-        ok(
-          false,
-          "Attaching to an exited target actor shouldn't generate a pause."
-        );
-        reject();
-      });
+async function testAttachRemovedTab(secondTab, secondTabFront) {
+  await removeTab(secondTab);
 
-      const { actorID } = gTab2Front;
-      gTab2Front.reconfigure({}).then(null, error => {
-        ok(
-          error.message.includes(
-            `Connection closed, pending request to ${actorID}, type reconfigure failed`
-          ),
-          "Actor is gone since the tab was removed."
-        );
-        resolve();
-      });
-    });
-  });
+  const { actorID } = secondTabFront;
+  try {
+    await secondTabFront.getFavicon({});
+    ok(
+      false,
+      "any request made to the descriptor for a closed tab should have failed"
+    );
+  } catch (error) {
+    ok(
+      error.message.includes(
+        `Connection closed, pending request to ${actorID}, type getFavicon failed`
+      ),
+      "Actor is gone since the tab was removed."
+    );
+  }
 }
 
-registerCleanupFunction(function() {
-  gTab1 = null;
-  gTab1Front = null;
-  gTab2 = null;
-  gTab2Front = null;
-  gClient = null;
-});
-
-async function getTargetActorForUrl(client, url) {
+async function getDescriptorActorForUrl(client, url) {
   const tabDescriptors = await client.mainRoot.listTabs();
   const tabDescriptor = tabDescriptors.find(front => front.url == url);
-  return tabDescriptor?.getTarget();
+  return tabDescriptor;
 }
--- a/devtools/server/actors/webconsole.js
+++ b/devtools/server/actors/webconsole.js
@@ -193,21 +193,16 @@ const WebConsoleActor = ActorClassWithSp
     );
     this._onObserverNotification = this._onObserverNotification.bind(this);
     if (this.parentActor.isRootActor) {
       Services.obs.addObserver(
         this._onObserverNotification,
         "last-pb-context-exited"
       );
     }
-
-    this.traits = {
-      // Supports retrieving blocked urls
-      blockedUrls: true,
-    };
   },
   /**
    * Debugger instance.
    *
    * @see jsdebugger.jsm
    */
   dbg: null,
 
@@ -235,22 +230,16 @@ const WebConsoleActor = ActorClassWithSp
 
   /**
    * The devtools server connection instance.
    * @type object
    */
   conn: null,
 
   /**
-   * List of supported features by the console actor.
-   * @type object
-   */
-  traits: null,
-
-  /**
    * The global we work with (this can be a Window, a Worker global or even a Sandbox
    * for processes and addons).
    *
    * @type nsIDOMWindow, WorkerGlobalScope or Sandbox
    */
   get global() {
     if (this.parentActor.isRootActor) {
       return this._getWindowForBrowserConsole();
@@ -789,17 +778,16 @@ const WebConsoleActor = ActorClassWithSp
     }
 
     // Update the live list of running listeners
     startedListeners.forEach(this._listeners.add, this._listeners);
 
     return {
       startedListeners: startedListeners,
       nativeConsoleAPI: this.hasNativeConsoleAPI(this.global),
-      traits: this.traits,
     };
   },
 
   /**
    * Handler for the "stopListeners" request.
    *
    * @param array listeners
    *        An array of events to stop sent by the Web Console client.
--- a/devtools/shared/specs/webconsole.js
+++ b/devtools/shared/specs/webconsole.js
@@ -7,24 +7,19 @@
 const {
   types,
   generateActorSpec,
   RetVal,
   Option,
   Arg,
 } = require("devtools/shared/protocol");
 
-types.addDictType("console.traits", {
-  evaluateJSAsync: "boolean",
-});
-
 types.addDictType("console.startlisteners", {
   startedListeners: "array:string",
   nativeConsoleAPI: "nullable:boolean",
-  traits: "console.traits",
 });
 
 types.addDictType("console.stoplisteners", {
   stoppedListeners: "array:string",
 });
 
 types.addDictType("console.autocomplete", {
   matches: "array:string",
--- a/dom/chrome-webidl/WindowGlobalActors.webidl
+++ b/dom/chrome-webidl/WindowGlobalActors.webidl
@@ -116,17 +116,17 @@ interface WindowGlobalParent : WindowCon
   /**
    * Get or create the JSWindowActor with the given name.
    *
    * See WindowActorOptions from JSWindowActor.webidl for details on how to
    * customize actor creation.
    */
   [Throws]
   JSWindowActorParent getActor(UTF8String name);
-  JSWindowActorParent getExistingActor(UTF8String name);
+  JSWindowActorParent? getExistingActor(UTF8String name);
 
   /**
    * Renders a region of the frame into an image bitmap.
    *
    * @param rect Specify the area of the document to render, in CSS pixels,
    * relative to the page. If null, the currently visible viewport is rendered.
    * @param scale The scale to render the window at. Use devicePixelRatio
    * to have comparable rendering to the OS.
@@ -186,10 +186,10 @@ interface WindowGlobalChild {
   /**
    * Get or create the JSWindowActor with the given name.
    *
    * See WindowActorOptions from JSWindowActor.webidl for details on how to
    * customize actor creation.
    */
   [Throws]
   JSWindowActorChild getActor(UTF8String name);
-  JSWindowActorChild getExistingActor(UTF8String name);
+  JSWindowActorChild? getExistingActor(UTF8String name);
 };
--- a/dom/fetch/tests/crashtests/1664514.html
+++ b/dom/fetch/tests/crashtests/1664514.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
-<h3>Set <code>privacy.file_unique_origin</code> to false when testing this.</h3>
 <script>
   fetch("./url.url")
 </script>
--- a/dom/fetch/tests/crashtests/crashtests.list
+++ b/dom/fetch/tests/crashtests/crashtests.list
@@ -1,2 +1,2 @@
 load 1577196.html
-pref(privacy.file_unique_origin,false) load 1664514.html
+load 1664514.html
--- a/dom/interfaces/base/nsIBrowser.idl
+++ b/dom/interfaces/base/nsIBrowser.idl
@@ -125,38 +125,16 @@ interface nsIBrowser : nsISupports
                                in nsIContentSecurityPolicy aCSP,
                                in nsIReferrerInfo aReferrerInfo,
                                in boolean aIsSynthetic,
                                in boolean aHasRequestContextID,
                                in uint64_t aRequestContextID,
                                in AString aContentType);
 
   /**
-   * Determine what process switching behavior this browser element should have.
-   */
-  cenum ProcessBehavior : 8 {
-    // Gecko won't automatically change which process this frame, or it's
-    // subframes, are loaded in.
-    PROCESS_BEHAVIOR_DISABLED,
-
-    // If `useRemoteTabs` is enabled, Gecko will change which process this frame
-    // is loaded in automatically, without calling `performProcessSwitch`.
-    // When `useRemoteSubframes` is enabled, subframes will change processes.
-    PROCESS_BEHAVIOR_STANDARD,
-
-    // Gecko won't automatically change which process this frame is loaded, but
-    // when `useRemoteSubframes` is enabled, subframes will change processes.
-    //
-    // NOTE: This configuration is included only for backwards compatibility,
-    // and will be removed, as it can easily lead to invalid behavior.
-    PROCESS_BEHAVIOR_SUBFRAME_ONLY,
-  };
-  readonly attribute nsIBrowser_ProcessBehavior processSwitchBehavior;
-
-  /**
    * Called to perform any async tasks which must be completed before changing
    * remoteness. Gecko will wait for the returned promise to resolve before
    * performing the process switch.
    */
   Promise prepareToChangeRemoteness();
 
   /** Called immediately before changing remoteness */
   void beforeChangeRemoteness();
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -1675,22 +1675,24 @@ static void DisconnectWindowServer(bool 
   // because it's not running a native event loop. See bug 1384336.
   // This is required with or without the sandbox enabled. Until the
   // window server is blocked as the policy level, this should be called
   // just before CGSSetDenyWindowServerConnections() so there are no
   // windowserver connections active when CGSSetDenyWindowServerConnections()
   // is called.
   CGSShutdownServerConnections();
 
-  // Actual security benefits are only acheived when we additionally deny
-  // future connections, however this currently breaks WebGL so it's not done
-  // by default.
+  // Actual security benefits are only achieved when we additionally deny
+  // future connections using the sandbox policy. WebGL must be remoted if
+  // the windowserver connections are blocked. WebGL remoting is disabled
+  // for some tests.
   if (aIsSandboxEnabled &&
       Preferences::GetBool(
-          "security.sandbox.content.mac.disconnect-windowserver")) {
+          "security.sandbox.content.mac.disconnect-windowserver") &&
+      Preferences::GetBool("webgl.out-of-process")) {
     CGError result = CGSSetDenyWindowServerConnections(true);
     MOZ_DIAGNOSTIC_ASSERT(result == kCGErrorSuccess);
 #  if !MOZ_DIAGNOSTIC_ASSERT_ENABLED
     Unused << result;
 #  endif
   }
 }
 #endif
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -2404,19 +2404,22 @@ static void CacheSandboxParams(std::vect
     info.shouldLog = true;
   }
 
   // Audio access
   if (!StaticPrefs::media_cubeb_sandbox()) {
     info.hasAudio = true;
   }
 
-  // Windowserver access
+  // Window server access. If the disconnect-windowserver pref is not
+  // "true" or out-of-process WebGL is not enabled, allow window server
+  // access in the sandbox policy.
   if (!Preferences::GetBool(
-          "security.sandbox.content.mac.disconnect-windowserver")) {
+          "security.sandbox.content.mac.disconnect-windowserver") ||
+      !Preferences::GetBool("webgl.out-of-process")) {
     info.hasWindowServer = true;
   }
 
   // .app path (normalized)
   nsAutoCString appPath;
   if (!nsMacUtilsImpl::GetAppPath(appPath)) {
     MOZ_CRASH("Failed to get app dir paths");
   }
--- a/dom/workers/test/browser_fileURL.js
+++ b/dom/workers/test/browser_fileURL.js
@@ -1,115 +1,13 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
-const WORKER_BODY = "postMessage(42);\n";
-
-// file:// tests.
-add_task(async function() {
-  await SpecialPowers.pushPrefEnv({
-    set: [["privacy.file_unique_origin", false]],
-  });
-
-  info("Creating the tmp directory.");
-  let parent = Cc["@mozilla.org/file/directory_service;1"]
-    .getService(Ci.nsIDirectoryService)
-    .QueryInterface(Ci.nsIProperties)
-    .get("TmpD", Ci.nsIFile);
-  parent.append("worker-dir-test");
-  parent.createUnique(Ci.nsIFile.DIRECTORY_TYPE, 0o700);
-
-  let dir_a = parent.clone();
-  dir_a.append("a");
-  dir_a.create(Ci.nsIFile.DIRECTORY_TYPE, 0o700);
-
-  let page_a = dir_a.clone();
-  page_a.append("empty.html");
-  page_a.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o600);
-
-  let url_a = Services.io.newFileURI(page_a);
-
-  let worker = dir_a.clone();
-  worker.append("worker.js");
-
-  let stream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(
-    Ci.nsIFileOutputStream
-  );
-  stream.init(
-    worker,
-    0x02 | 0x08 | 0x20, // write, create, truncate
-    0o666,
-    0
-  );
-  stream.write(WORKER_BODY, WORKER_BODY.length);
-  stream.close();
-
-  let url_worker = Services.io.newFileURI(worker);
-
-  let dir_b = parent.clone();
-  dir_b.append("b");
-  dir_b.create(Ci.nsIFile.DIRECTORY_TYPE, 0o700);
-
-  let page_b = dir_b.clone();
-  page_b.append("empty.html");
-  page_b.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o600);
-
-  let url_b = Services.io.newFileURI(page_b);
-
-  let tab = BrowserTestUtils.addTab(gBrowser, url_a.spec);
-  gBrowser.selectedTab = tab;
-
-  let browser = gBrowser.getBrowserForTab(tab);
-  await BrowserTestUtils.browserLoaded(browser);
-
-  await SpecialPowers.spawn(browser, [url_worker.spec], function(spec) {
-    return new content.Promise((resolve, reject) => {
-      let w = new content.window.Worker(spec);
-      w.onerror = _ => {
-        reject();
-      };
-      w.onmessage = _ => {
-        resolve();
-      };
-    });
-  });
-  ok(true, "The worker is loaded when the script is on the same directory.");
-
-  BrowserTestUtils.removeTab(tab);
-
-  tab = BrowserTestUtils.addTab(gBrowser, url_b.spec);
-  gBrowser.selectedTab = tab;
-
-  browser = gBrowser.getBrowserForTab(tab);
-  await BrowserTestUtils.browserLoaded(browser);
-
-  await SpecialPowers.spawn(browser, [url_worker.spec], function(spec) {
-    return new content.Promise((resolve, reject) => {
-      let w = new content.window.Worker(spec);
-      w.onerror = _ => {
-        resolve();
-      };
-      w.onmessage = _ => {
-        reject();
-      };
-    });
-  });
-  ok(
-    true,
-    "The worker is not loaded when the script is on a different directory."
-  );
-
-  BrowserTestUtils.removeTab(tab);
-
-  info("Removing the tmp directory.");
-  parent.remove(true);
-});
-
 const EMPTY_URL = "/browser/dom/workers/test/empty.html";
 const WORKER_URL = "/browser/dom/workers/test/empty_worker.js";
 
 add_task(async function() {
   let tab = BrowserTestUtils.addTab(
     gBrowser,
     "http://mochi.test:8888" + EMPTY_URL
   );
--- a/gfx/2d/MacIOSurface.cpp
+++ b/gfx/2d/MacIOSurface.cpp
@@ -92,34 +92,34 @@ already_AddRefed<MacIOSurface> MacIOSurf
       new MacIOSurface(std::move(surfaceRef), aHasAlpha);
 
   return ioSurface.forget();
 }
 
 size_t CreatePlaneDictionary(CFTypeRefPtr<CFMutableDictionaryRef>& aDict,
                              const gfx::IntSize& aSize, size_t aOffset,
                              size_t aBytesPerPixel) {
-  size_t bytesPerRow = IOSurfaceAlignProperty(kIOSurfaceBytesPerRow,
+  size_t bytesPerRow = IOSurfaceAlignProperty(kIOSurfacePlaneBytesPerRow,
                                               aSize.width * aBytesPerPixel);
   // Add a SIMD register worth of extra bytes to the end of the allocation for
   // SWGL.
-  size_t totalBytes = IOSurfaceAlignProperty(kIOSurfaceAllocSize,
+  size_t totalBytes = IOSurfaceAlignProperty(kIOSurfacePlaneSize,
                                              aSize.height * bytesPerRow + 16);
 
   aDict = CFTypeRefPtr<CFMutableDictionaryRef>::WrapUnderCreateRule(
       ::CFDictionaryCreateMutable(kCFAllocatorDefault, 4,
                                   &kCFTypeDictionaryKeyCallBacks,
                                   &kCFTypeDictionaryValueCallBacks));
 
   AddDictionaryInt(aDict, kIOSurfacePlaneWidth, aSize.width);
   AddDictionaryInt(aDict, kIOSurfacePlaneHeight, aSize.height);
   AddDictionaryInt(aDict, kIOSurfacePlaneBytesPerRow, bytesPerRow);
   AddDictionaryInt(aDict, kIOSurfacePlaneOffset, aOffset);
   AddDictionaryInt(aDict, kIOSurfacePlaneSize, totalBytes);
-  AddDictionaryInt(aDict, kIOSurfaceBytesPerElement, aBytesPerPixel);
+  AddDictionaryInt(aDict, kIOSurfacePlaneBytesPerElement, aBytesPerPixel);
 
   return totalBytes;
 }
 
 /* static */
 already_AddRefed<MacIOSurface> MacIOSurface::CreateNV12Surface(
     const IntSize& aYSize, const IntSize& aCbCrSize, YUVColorSpace aColorSpace,
     ColorRange aColorRange) {
@@ -145,21 +145,25 @@ already_AddRefed<MacIOSurface> MacIOSurf
     AddDictionaryInt(props, kIOSurfacePixelFormat,
                      (uint32_t)kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
   } else {
     AddDictionaryInt(props, kIOSurfacePixelFormat,
                      (uint32_t)kCVPixelFormatType_420YpCbCr8BiPlanarFullRange);
   }
 
   CFTypeRefPtr<CFMutableDictionaryRef> planeProps[2];
-  size_t planeTotalBytes = CreatePlaneDictionary(planeProps[0], aYSize, 0, 1);
-  planeTotalBytes +=
-      CreatePlaneDictionary(planeProps[1], aCbCrSize, planeTotalBytes, 2);
+  size_t yPlaneBytes = CreatePlaneDictionary(planeProps[0], aYSize, 0, 1);
+  size_t cbCrOffset =
+      IOSurfaceAlignProperty(kIOSurfacePlaneOffset, yPlaneBytes);
+  size_t cbCrPlaneBytes =
+      CreatePlaneDictionary(planeProps[1], aCbCrSize, cbCrOffset, 2);
+  size_t totalBytes =
+      IOSurfaceAlignProperty(kIOSurfaceAllocSize, cbCrOffset + cbCrPlaneBytes);
 
-  AddDictionaryInt(props, kIOSurfaceAllocSize, planeTotalBytes);
+  AddDictionaryInt(props, kIOSurfaceAllocSize, totalBytes);
 
   auto array = CFTypeRefPtr<CFArrayRef>::WrapUnderCreateRule(
       CFArrayCreate(kCFAllocatorDefault, (const void**)planeProps, 2,
                     &kCFTypeArrayCallBacks));
   ::CFDictionaryAddValue(props.get(), kIOSurfacePlaneInfo, array.get());
 
   CFTypeRefPtr<IOSurfaceRef> surfaceRef =
       CFTypeRefPtr<IOSurfaceRef>::WrapUnderCreateRule(
--- a/gfx/config/gfxVars.h
+++ b/gfx/config/gfxVars.h
@@ -57,16 +57,18 @@ class gfxVarReceiver;
   _(WebRenderBatchingLookback, int32_t, 10)                        \
   _(WebRenderBlobTileSize, int32_t, 256)                           \
   _(UseSoftwareWebRender, bool, false)                             \
   _(AllowSoftwareWebRenderD3D11, bool, false)                      \
   _(ScreenDepth, int32_t, 0)                                       \
   _(GREDirectory, nsString, nsString())                            \
   _(ProfDirectory, nsString, nsString())                           \
   _(AllowD3D11KeyedMutex, bool, false)                             \
+  _(SwapIntervalGLX, bool, false)                                  \
+  _(SwapIntervalEGL, bool, false)                                  \
   _(SystemTextQuality, int32_t, 5 /* CLEARTYPE_QUALITY */)         \
   _(SystemTextClearTypeLevel, float, 1.0f)                         \
   _(SystemTextEnhancedContrast, float, 1.0f)                       \
   _(SystemTextGamma, float, 2.2f)                                  \
   _(SystemTextPixelGeometry, int32_t, 1 /* pixel geometry RGB */)  \
   _(SystemTextRenderingMode, int32_t, 0)                           \
   _(SystemGDIGamma, float, 1.4f)                                   \
   _(LayersWindowRecordingPath, nsCString, nsCString())             \
--- a/gfx/gl/GLContextProviderEGL.cpp
+++ b/gfx/gl/GLContextProviderEGL.cpp
@@ -305,22 +305,24 @@ already_AddRefed<GLContext> GLContextEGL
   }
 
   gl->MakeCurrent();
   gl->SetIsDoubleBuffered(doubleBuffered);
 
 #ifdef MOZ_GTK_WAYLAND
   if (surface && GdkIsWaylandDisplay()) {
     // Make eglSwapBuffers() non-blocking on wayland
-    egl->fSwapInterval(0);
+    const int interval = gfxVars::SwapIntervalEGL() ? 1 : 0;
+    egl->fSwapInterval(interval);
   }
 #endif
   if (aHardwareWebRender && egl->mLib->IsANGLE()) {
     MOZ_ASSERT(doubleBuffered);
-    egl->fSwapInterval(0);
+    const int interval = gfxVars::SwapIntervalEGL() ? 1 : 0;
+    egl->fSwapInterval(interval);
   }
   return gl.forget();
 }
 
 already_AddRefed<GLContext> GLContextEGLFactory::Create(
     EGLNativeWindowType aWindow, bool aHardwareWebRender) {
   bool preferGles;
 #if defined(MOZ_WIDGET_ANDROID)
@@ -495,18 +497,20 @@ bool GLContextEGL::RenewSurface(Composit
       NS_WARNING("Failed to create EGLSurface from native window");
       return false;
     }
   }
   const bool ok = MakeCurrent(true);
   MOZ_ASSERT(ok);
 #ifdef MOZ_GTK_WAYLAND
   if (mSurface && GdkIsWaylandDisplay()) {
-    // Make eglSwapBuffers() non-blocking on wayland
-    mEgl->fSwapInterval(0);
+    // The swap interval pref is false by default so that eglSwapBuffers()
+    // is non-blocking on wayland.
+    const int interval = gfxVars::SwapIntervalEGL() ? 1 : 0;
+    mEgl->fSwapInterval(interval);
   }
 #endif
   return ok;
 }
 
 void GLContextEGL::ReleaseSurface() {
   if (mOwnsContext) {
     mozilla::gl::DestroySurface(*mEgl, mSurface);
--- a/gfx/gl/GLContextProviderGLX.cpp
+++ b/gfx/gl/GLContextProviderGLX.cpp
@@ -477,18 +477,20 @@ bool GLContextGLX::MakeCurrentImpl() con
 
   const bool succeeded = mGLX->fMakeCurrent(*mDisplay, mDrawable, mContext);
   NS_ASSERTION(succeeded, "Failed to make GL context current!");
 
   if (!IsOffscreen() && mGLX->SupportsSwapControl()) {
     // Many GLX implementations default to blocking until the next
     // VBlank when calling glXSwapBuffers. We want to run unthrottled
     // in ASAP mode. See bug 1280744.
+    const bool swapInterval = gfxVars::SwapIntervalGLX();
     const bool isASAP = (StaticPrefs::layout_frame_rate() == 0);
-    mGLX->fSwapInterval(*mDisplay, mDrawable, isASAP ? 0 : 1);
+    const int interval = (swapInterval && !isASAP) ? 1 : 0;
+    mGLX->fSwapInterval(*mDisplay, mDrawable, interval);
   }
   return succeeded;
 }
 
 bool GLContextGLX::IsCurrentImpl() const {
   return mGLX->fGetCurrentContext() == mContext;
 }
 
--- a/gfx/layers/apz/test/mochitest/apz_test_utils.js
+++ b/gfx/layers/apz/test/mochitest/apz_test_utils.js
@@ -770,35 +770,32 @@ async function injectScript(aScript, aWi
   await loadPromise;
 }
 
 // Compute some configuration information used for hit testing.
 // The computed information is cached to avoid recomputing it
 // each time this function is called.
 // The computed information is an object with three fields:
 //   utils: the nsIDOMWindowUtils instance for this window
-//   isWebRender: true if WebRender is enabled
 //   isWindow: true if the platform is Windows
 //   activateAllScrollFrames: true if prefs indicate all scroll frames are
 //                            activated with at least a minimal display port
 function getHitTestConfig() {
   if (!("hitTestConfig" in window)) {
     var utils = SpecialPowers.getDOMWindowUtils(window);
-    var isWebRender = utils.layerManagerType.startsWith("WebRender");
     var isWindows = getPlatform() == "windows";
     let activateAllScrollFrames =
       SpecialPowers.getBoolPref("apz.wr.activate_all_scroll_frames") ||
       (SpecialPowers.getBoolPref(
         "apz.wr.activate_all_scroll_frames_when_fission"
       ) &&
         SpecialPowers.Services.appinfo.fissionAutostart);
 
     window.hitTestConfig = {
       utils,
-      isWebRender,
       isWindows,
       activateAllScrollFrames,
     };
   }
   return window.hitTestConfig;
 }
 
 // Compute the coordinates of the center of the given element. The argument
@@ -936,37 +933,25 @@ function hitTestScrollbar(params) {
   // The direction flag (APZHitResultFlags.SCROLLBAR_VERTICAL) is added in
   // later, for the vertical test only.
   // The APZHitResultFlags.SCROLLBAR flag will be present regardless of whether
   // the layer is active or inactive because we force layerization of scrollbar
   // tracks. Unfortunately not forcing the layerization results in different
   // behaviour on different platforms which makes testing harder.
   var expectedHitInfo = APZHitResultFlags.VISIBLE | APZHitResultFlags.SCROLLBAR;
   if (params.expectThumb) {
-    // The thumb has listeners which are APZ-aware. With WebRender we are able
-    // to losslessly propagate this flag to APZ, but with non-WebRender the area
-    // ends up in the mDispatchToContentRegion which we then convert back to
-    // a IRREGULAR_AREA flag. This still works correctly since IRREGULAR_AREA
-    // will fall back to the main thread for everything.
-    if (config.isWebRender) {
-      expectedHitInfo |= APZHitResultFlags.APZ_AWARE_LISTENERS;
-      if (
-        !config.activateAllScrollFrames &&
-        params.layerState == LayerState.INACTIVE
-      ) {
-        expectedHitInfo |= APZHitResultFlags.INACTIVE_SCROLLFRAME;
-      }
-    } else {
-      expectedHitInfo |= APZHitResultFlags.IRREGULAR_AREA;
+    // The thumb has listeners which are APZ-aware.
+    expectedHitInfo |= APZHitResultFlags.APZ_AWARE_LISTENERS;
+    var expectActive =
+      config.activateAllScrollFrames || params.layerState == LayerState.ACTIVE;
+    if (!expectActive) {
+      expectedHitInfo |= APZHitResultFlags.INACTIVE_SCROLLFRAME;
     }
     // We do not generate the layers for thumbs on inactive scrollframes.
-    if (
-      params.layerState == LayerState.ACTIVE ||
-      config.activateAllScrollFrames
-    ) {
+    if (expectActive) {
       expectedHitInfo |= APZHitResultFlags.SCROLLBAR_THUMB;
     }
   }
 
   var expectedScrollId = params.expectedScrollId;
   if (config.activateAllScrollFrames) {
     expectedScrollId = config.utils.getViewId(params.element);
     if (params.layerState == LayerState.ACTIVE) {
--- a/gfx/layers/apz/test/mochitest/browser_test_group_fission.js
+++ b/gfx/layers/apz/test/mochitest/browser_test_group_fission.js
@@ -17,19 +17,16 @@ add_task(async function test_main() {
   function httpURL(filename) {
     let chromeURL = getRootDirectory(gTestPath) + filename;
     return chromeURL.replace(
       "chrome://mochitests/content/",
       "http://mochi.test:8888/"
     );
   }
 
-  var utils = SpecialPowers.getDOMWindowUtils(window);
-  var isWebRender = utils.layerManagerType.startsWith("WebRender");
-
   // Each of these subtests is a dictionary that contains:
   // file (required): filename of the subtest that will get opened in a new tab
   //   in the top-level fission-enabled browser window.
   // setup (optional): function that takes the top-level fission window and is
   //   run once after the subtest is loaded but before it is started.
   var subtests = [
     { file: "helper_fission_basic.html" },
     { file: "helper_fission_transforms.html" },
@@ -59,36 +56,22 @@ add_task(async function test_main() {
       file: "helper_fission_tap_in_nested_iframe_on_zoomed.html",
       prefs: [["apz.max_tap_time", 10000]],
     },
     { file: "helper_fission_scroll_handoff.html" },
     { file: "helper_fission_large_subframe.html" },
     { file: "helper_fission_initial_displayport.html" },
     { file: "helper_fission_checkerboard_severity.html" },
     { file: "helper_fission_setResolution.html" },
+    { file: "helper_fission_inactivescroller_positionedcontent.html" },
+    { file: "helper_fission_irregular_areas.html" },
+    // Bug 1576514: On WebRender this test casues an assertion.
+    // { file: "helper_fission_animation_styling_in_transformed_oopif.html", },
     // add additional tests here
   ];
-  // These tests are to ensure hit-testing works perfectly on the WR
-  // codepath. The layers codepath may need a main-thread fallback to get
-  // these working, but we can't use our synchronous hitTest(...) helpers
-  // for those anyway.
-  if (isWebRender) {
-    subtests = subtests.concat([
-      { file: "helper_fission_inactivescroller_positionedcontent.html" },
-      { file: "helper_fission_irregular_areas.html" },
-      // add WebRender-specific tests here
-    ]);
-  } else {
-    subtests = subtests.concat([
-      // Bug 1576514: On WebRender this test casues an assertion.
-      {
-        file: "helper_fission_animation_styling_in_transformed_oopif.html",
-      },
-    ]);
-  }
 
   // ccov builds run slower and need longer, so let's scale up the timeout
   // by the number of tests we're running.
   requestLongerTimeout(subtests.length);
 
   let fissionWindow = await BrowserTestUtils.openNewBrowserWindow({
     fission: true,
   });
--- a/gfx/layers/apz/test/mochitest/helper_check_dp_size.html
+++ b/gfx/layers/apz/test/mochitest/helper_check_dp_size.html
@@ -95,23 +95,23 @@ https://bugzilla.mozilla.org/show_bug.cg
       // to display port height.
       // In the comment following each line we record the values of the display
       // port height at the time of writing the test in both the good (ie with
       // the bug this test is testing fixed), and bad (before the bug this
       // test is testing fixed) cases. These values can obviously be different,
       // but it gives a good idea that the good and bad values are far apart so
       // this test should be robust, and provides good context in the future if
       // this test starts failing.
-      await testOne( 50, 5.2, "(height 50)");                                        // good wr  256 non-wr 256, bad wr  256 non-wr  384
-      await testOne(128, 2.1, "(height128)");                                        // good wr  256 non-wr 256, bad wr  512 non-wr  640
-      await testOne(200, 2.0, "(height200)");                                        // good wr  384 non-wr 384, bad wr  768 non-wr  896
-      await testOne(256, 1.6, "(height256)");                                        // good wr  384 non-wr 384, bad wr  768 non-wr 1024
-      await testOne(329, 1.6, "(height329)");                                        // good wr  512 non-wr 512, bad wr  896 non-wr 1280
-      await testOne(500, 1.3, "(height500)");                                        // good wr  640 non-wr 640, bad wr 1280 non-wr 1920
-      await testOne(640, getHitTestConfig().isWebRender ? 1.7 : 1.3, "(height640)"); // good wr 1024 non-wr 768, bad wr 1536 non-wr 2432
+      await testOne( 50, 5.2, "(height 50)"); // good 256, bad 256
+      await testOne(128, 2.1, "(height128)"); // good 256, bad 512
+      await testOne(200, 2.0, "(height200)"); // good 384, bad 768
+      await testOne(256, 1.6, "(height256)"); // good 384, bad 768
+      await testOne(329, 1.6, "(height329)"); // good 512, bad 896
+      await testOne(500, 1.3, "(height500)"); // good 640, bad 280
+      await testOne(640, 1.7, "(height640)"); // good 1024, bad 1536
 
     }
 
     waitUntilApzStable()
     .then(forceLayerTreeToCompositor)
     .then(test)
     .then(subtestDone, subtestFailed);
   </script>
--- a/gfx/layers/apz/test/mochitest/helper_hittest_basic.html
+++ b/gfx/layers/apz/test/mochitest/helper_hittest_basic.html
@@ -20,22 +20,18 @@
 async function test() {
   var config = getHitTestConfig();
   var utils = config.utils;
 
   var scroller = document.getElementById("scroller");
   var apzaware = document.getElementById("apzaware");
 
   let expectedHitInfo = APZHitResultFlags.VISIBLE;
-  if (config.isWebRender) {
-    if (!config.activateAllScrollFrames) {
-      expectedHitInfo |= APZHitResultFlags.INACTIVE_SCROLLFRAME;
-    }
-  } else {
-    expectedHitInfo |= APZHitResultFlags.IRREGULAR_AREA;
+  if (!config.activateAllScrollFrames) {
+    expectedHitInfo |= APZHitResultFlags.INACTIVE_SCROLLFRAME;
   }
   checkHitResult(hitTest(centerOf(scroller)),
                  expectedHitInfo,
                  (config.activateAllScrollFrames ? utils.getViewId(scroller)
                                                  : utils.getViewId(document.scrollingElement)),
                  utils.getLayersId(),
                  "inactive scrollframe");
 
@@ -61,40 +57,37 @@ async function test() {
 
   // activate the scrollframe but keep the main-thread scroll position at 0.
   // also apply a async scroll offset in the y-direction such that the
   // scrollframe scrolls to the bottom of its range.
   utils.setDisplayPortForElement(0, 0, 500, 500, scroller, 1);
   await promiseApzFlushedRepaints();
   var scrollY = scroller.scrollTopMax;
   utils.setAsyncScrollOffset(scroller, 0, scrollY);
-  if (config.isWebRender) {
-    // Tick the refresh driver once to make sure the compositor has applied the
-    // async scroll offset (for APZ hit-testing this doesn't matter, but for
-    // WebRender hit-testing we need to make sure WR has the latest info).
-    utils.advanceTimeAndRefresh(16);
-    utils.restoreNormalRefresh();
-  }
+  // Tick the refresh driver once to make sure the compositor has applied the
+  // async scroll offset (for WebRender hit-testing we need to make sure WR has
+  // the latest info).
+  utils.advanceTimeAndRefresh(16);
+  utils.restoreNormalRefresh();
 
   var scrollerViewId = utils.getViewId(scroller);
 
   // Now we again test the middle of the scrollframe, which is now active
   checkHitResult(hitTest(centerOf(scroller)),
                  APZHitResultFlags.VISIBLE,
                  scrollerViewId,
                  utils.getLayersId(),
                  "active scrollframe");
 
   // Test the apz-aware block
   var apzawarePosition = centerOf(apzaware); // main thread position
   apzawarePosition.y -= scrollY; // APZ position
   checkHitResult(hitTest(apzawarePosition),
                  APZHitResultFlags.VISIBLE |
-                 (config.isWebRender ? APZHitResultFlags.APZ_AWARE_LISTENERS
-                                     : APZHitResultFlags.IRREGULAR_AREA),
+                 APZHitResultFlags.APZ_AWARE_LISTENERS,
                  scrollerViewId,
                  utils.getLayersId(),
                  "active scrollframe - apzaware block");
 
   // Test the scrollbars. Note that this time the vertical scrollthumb is
   // going to be at the bottom of the track. We'll test both the top and the
   // bottom.
 
--- a/gfx/layers/apz/test/mochitest/helper_hittest_checkerboard.html
+++ b/gfx/layers/apz/test/mochitest/helper_hittest_checkerboard.html
@@ -26,23 +26,21 @@ async function test() {
   // Activate the scrollframe but keep the main-thread scroll position at 0.
   // Also apply an async scroll offset in the y-direction such that the
   // scrollframe scrolls all the way to the bottom of its range, where it's
   // sure to checkerboard.
   utils.setDisplayPortForElement(0, 0, 300, 1000, scroller, 1);
   await promiseApzFlushedRepaints();
   var scrollY = scroller.scrollTopMax;
   utils.setAsyncScrollOffset(scroller, 0, scrollY);
-  if (config.isWebRender) {
-    // Tick the refresh driver once to make sure the compositor has applied the
-    // async scroll offset (for APZ hit-testing this doesn't matter, but for
-    // WebRender hit-testing we need to make sure WR has the latest info).
-    utils.advanceTimeAndRefresh(16);
-    utils.restoreNormalRefresh();
-  }
+  // Tick the refresh driver once to make sure the compositor has applied the
+  // async scroll offset (for WebRender hit-testing we need to make sure WR has
+  // the latest info).
+  utils.advanceTimeAndRefresh(16);
+  utils.restoreNormalRefresh();
 
   var scrollerViewId = utils.getViewId(scroller);
 
   // Hit-test the middle of the scrollframe, which is now inside the
   // checkerboarded region, and check that we hit the scrollframe and
   // not its parent.
   checkHitResult(hitTest(centerOf(scroller)),
                  APZHitResultFlags.VISIBLE,
--- a/gfx/layers/apz/test/mochitest/helper_hittest_clippath.html
+++ b/gfx/layers/apz/test/mochitest/helper_hittest_clippath.html
@@ -30,90 +30,84 @@
 when this page loads, the blue rect should be behind the green circle. mousing over the area with the blue rect and scrolling with the wheel or trackpad should cause the iframe to scroll."></iframe>
 <div id="clipped"></div>
 <script>
 
 async function test() {
   var config = getHitTestConfig();
   var utils = config.utils;
 
-  const wrTag = config.isWebRender ? "WebRender" : "Layers";
-
   // layerize the iframe
   var subwindow = document.getElementById("sub").contentWindow;
   var subscroller = subwindow.document.scrollingElement;
   var subutils = SpecialPowers.getDOMWindowUtils(subwindow);
   subutils.setDisplayPortForElement(0, 0, 400, 1000, subscroller, 1);
   await promiseApzFlushedRepaints();
 
   var rootViewId = utils.getViewId(document.scrollingElement);
   var iframeViewId = subutils.getViewId(subscroller);
   var layersId = utils.getLayersId();
   is(subutils.getLayersId(), layersId, "iframe is not OOP");
 
   checkHitResult(hitTest({ x: 10, y: 10 }),
       APZHitResultFlags.VISIBLE,
       iframeViewId,
       layersId,
-      `${wrTag} (simple) uninteresting point inside the iframe`);
+      `(simple) uninteresting point inside the iframe`);
   checkHitResult(hitTest({ x: 500, y: 10 }),
       APZHitResultFlags.VISIBLE,
       rootViewId,
       layersId,
-      `${wrTag} (simple) uninteresting point in the root scroller`);
+      `(simple) uninteresting point in the root scroller`);
   checkHitResult(hitTest({ x: 110, y: 110 }),
       APZHitResultFlags.VISIBLE,
       iframeViewId,
       layersId,
-      `${wrTag} (simple) point in the iframe behind overlaying div, but outside the bounding box of the clip path`);
+      `(simple) point in the iframe behind overlaying div, but outside the bounding box of the clip path`);
   checkHitResult(hitTest({ x: 160, y: 160 }),
-      config.isWebRender ? APZHitResultFlags.VISIBLE
-                         : APZHitResultFlags.VISIBLE | APZHitResultFlags.IRREGULAR_AREA,
-      config.isWebRender ? iframeViewId : rootViewId,
+      APZHitResultFlags.VISIBLE,
+      iframeViewId,
       layersId,
-      `${wrTag} (simple) point in the iframe behind overlaying div, inside the bounding box of the clip path, but outside the actual clip shape`);
+      `(simple) point in the iframe behind overlaying div, inside the bounding box of the clip path, but outside the actual clip shape`);
   checkHitResult(hitTest({ x: 300, y: 200 }),
-      config.isWebRender ? APZHitResultFlags.VISIBLE
-                         : APZHitResultFlags.VISIBLE | APZHitResultFlags.IRREGULAR_AREA,
+      APZHitResultFlags.VISIBLE,
       rootViewId,
       layersId,
-      `${wrTag} (simple) point inside the clip shape of the overlaying div`);
+      `(simple) point inside the clip shape of the overlaying div`);
 
   // Now we turn the "simple" clip-path that WR can handle into a more complex
   // one that needs a mask. Then run the checks again; the expected results for
   // WR are slightly different
   document.getElementById("clipped").style.clipPath = "polygon(50px 200px, 75px 75px, 200px 50px, 350px 200px, 200px 350px)";
   await promiseApzFlushedRepaints();
 
   checkHitResult(hitTest({ x: 10, y: 10 }),
       APZHitResultFlags.VISIBLE,
       iframeViewId,
       layersId,
-      `${wrTag} (complex) uninteresting point inside the iframe`);
+      `(complex) uninteresting point inside the iframe`);
   checkHitResult(hitTest({ x: 500, y: 10 }),
       APZHitResultFlags.VISIBLE,
       rootViewId,
       layersId,
-      `${wrTag} (complex) uninteresting point in the root scroller`);
+      `(complex) uninteresting point in the root scroller`);
   checkHitResult(hitTest({ x: 110, y: 110 }),
       APZHitResultFlags.VISIBLE,
       iframeViewId,
       layersId,
-      `${wrTag} (complex) point in the iframe behind overlaying div, but outside the bounding box of the clip path`);
+      `(complex) point in the iframe behind overlaying div, but outside the bounding box of the clip path`);
   checkHitResult(hitTest({ x: 160, y: 160 }),
-      config.isWebRender ? APZHitResultFlags.VISIBLE
-                         : APZHitResultFlags.VISIBLE | APZHitResultFlags.IRREGULAR_AREA,
-      config.isWebRender ? iframeViewId : rootViewId,
+      APZHitResultFlags.VISIBLE,
+      iframeViewId,
       layersId,
-      `${wrTag} (complex) point in the iframe behind overlaying div, inside the bounding box of the clip path, but outside the actual clip shape`);
+      `(complex) point in the iframe behind overlaying div, inside the bounding box of the clip path, but outside the actual clip shape`);
   checkHitResult(hitTest({ x: 300, y: 200 }),
-      config.isWebRender ? APZHitResultFlags.VISIBLE
-                         : APZHitResultFlags.VISIBLE | APZHitResultFlags.IRREGULAR_AREA,
-      config.isWebRender ? iframeViewId : rootViewId,
+      APZHitResultFlags.VISIBLE,
+      iframeViewId,
       layersId,
-      `${wrTag} (complex) point inside the clip shape of the overlaying div`);
+      `(complex) point inside the clip shape of the overlaying div`);
 }
 
 waitUntilApzStable()
     .then(test)
     .then(subtestDone, subtestFailed);
 </script>
 </body></html>
--- a/gfx/layers/apz/test/mochitest/helper_hittest_hoisted_scrollinfo.html
+++ b/gfx/layers/apz/test/mochitest/helper_hittest_hoisted_scrollinfo.html
@@ -59,21 +59,18 @@ async function test() {
 
   // layerize the scrollable frame. It's inside the filter so this
   // shouldn't actually change the fact that it will still be main-thread
   // scrolled.
   var scroller = document.querySelector("#scroller");
   utils.setDisplayPortForElement(0, 0, 300, 500, scroller, 1);
   await promiseApzFlushedRepaints();
 
-  // Inactive scrollframe flags will round-trip through the dispatch-to-content
-  // region and end up as IRREGULAR_AREA when WebRender is disabled.
-  var expectedHitFlags = config.isWebRender
-    ? APZHitResultFlags.VISIBLE | APZHitResultFlags.INACTIVE_SCROLLFRAME
-    : APZHitResultFlags.VISIBLE | APZHitResultFlags.IRREGULAR_AREA;
+  var expectedHitFlags =
+    APZHitResultFlags.VISIBLE | APZHitResultFlags.INACTIVE_SCROLLFRAME;
   checkHitResult(hitTest(centerOf(scroller)),
                  expectedHitFlags,
                  utils.getViewId(scroller),
                  utils.getLayersId(),
                  "scrollable content inside a filter");
 }
 
 waitUntilApzStable()
--- a/gfx/layers/apz/test/mochitest/helper_hittest_overscroll_subframe.html
+++ b/gfx/layers/apz/test/mochitest/helper_hittest_overscroll_subframe.html
@@ -36,19 +36,19 @@
  <div class="spacer"></div>
 </body>
 <script type="application/javascript">
 
 async function test() {
   var config = getHitTestConfig();
   var utils = config.utils;
 
-  // Subframe hit testing of overscrolled APZCs does not yet work with WebRender,
-  // so bail out early.
-  if (config.isWebRender) {
+  // Subframe hit testing of overscrolled APZCs does not yet work with WebRender
+  // (bug 1701831), so bail out early.
+  if (true) {
     SimpleTest.todo(false, "This test does not currently pass with WebRender");
     return;
   }
 
   // Activate the subframe. This both matches reality (if you're
   // scrolling the subframe, it's active), and makes it easier
   // to check for expected hit test outcomes.
   utils.setDisplayPortForElement(0, 0, 500, 500, subframe, 1);
--- a/gfx/layers/apz/test/mochitest/helper_hittest_touchaction.html
+++ b/gfx/layers/apz/test/mochitest/helper_hittest_touchaction.html
@@ -115,22 +115,16 @@ async function test() {
     // layerize all the scrollable divs
     config.utils.setDisplayPortForElement(0, 0, 100, 100, scroller, 1);
   }
   await promiseApzFlushedRepaints();
 
   var scrollId = config.utils.getViewId(document.scrollingElement);
   var layersId = config.utils.getLayersId();
 
-  // Elements with APZ aware listeners round-trip through the dispatch-to-content
-  // region and end up as IRREGULAR_AREA when WebRender is disabled.
-  var touchListenerFlag = config.isWebRender
-        ? APZHitResultFlags.APZ_AWARE_LISTENERS
-        : APZHitResultFlags.IRREGULAR_AREA;
-
   checkHitResult(
       hitTest(centerOf("taNone")),
       APZHitResultFlags.VISIBLE |
       APZHitResultFlags.PAN_X_DISABLED |
       APZHitResultFlags.PAN_Y_DISABLED |
       APZHitResultFlags.PINCH_ZOOM_DISABLED |
       APZHitResultFlags.DOUBLE_TAP_ZOOM_DISABLED,
       scrollId,
@@ -258,33 +252,33 @@ async function test() {
       APZHitResultFlags.PINCH_ZOOM_DISABLED |
       APZHitResultFlags.DOUBLE_TAP_ZOOM_DISABLED,
       scrollId,
       layersId,
       "touch-action: none inside touch-action: manipulation");
   checkHitResult(
       hitTest(centerOf("taInnerManipListener")),
       APZHitResultFlags.VISIBLE |
-      touchListenerFlag |
+      APZHitResultFlags.APZ_AWARE_LISTENERS |
       APZHitResultFlags.DOUBLE_TAP_ZOOM_DISABLED,
       scrollId,
       layersId,
       "div with touch listener inside touch-action: manipulation");
 
   checkHitResult(
       hitTest(centerOf("taListener")),
       APZHitResultFlags.VISIBLE |
-      touchListenerFlag,
+      APZHitResultFlags.APZ_AWARE_LISTENERS,
       scrollId,
       layersId,
       "div with touch listener");
   checkHitResult(
       hitTest(centerOf("taInnerListenerPanX")),
       APZHitResultFlags.VISIBLE |
-      touchListenerFlag |
+      APZHitResultFlags.APZ_AWARE_LISTENERS |
       APZHitResultFlags.PAN_Y_DISABLED |
       APZHitResultFlags.PINCH_ZOOM_DISABLED |
       APZHitResultFlags.DOUBLE_TAP_ZOOM_DISABLED,
       scrollId,
       layersId,
       "touch-action: pan-x inside div with touch listener");
 
   checkHitResult(
@@ -346,19 +340,14 @@ async function test() {
       APZHitResultFlags.PAN_X_DISABLED |
       APZHitResultFlags.PINCH_ZOOM_DISABLED |
       APZHitResultFlags.DOUBLE_TAP_ZOOM_DISABLED,
       config.utils.getViewId(document.getElementById("taScroller4")),
       layersId,
       "overflow:hidden div doesn't reset pan-x/pan-y from enclosing scroller");
 }
 
-if (!config.isWebRender) {
-  ok(true, "This test is WebRender-only because we get a bunch of dispatch-to-content regions without it and the test isn't very interesting.");
-  subtestDone();
-} else {
-  waitUntilApzStable()
-    .then(test)
-    .then(subtestDone, subtestFailed);
-}
+waitUntilApzStable()
+  .then(test)
+  .then(subtestDone, subtestFailed);
 
 </script>
 </html>
--- a/gfx/layers/apz/test/mochitest/helper_overscroll_behavior_bug1425603.html
+++ b/gfx/layers/apz/test/mochitest/helper_overscroll_behavior_bug1425603.html
@@ -50,23 +50,21 @@ async function test() {
   //   the browser's content area. This is why we make the scroll frame
   //   small (100x100), and give it a display port that's also just 100x100,
   //   so we can keep the async scroll offset small enough (300 in this case)
   //   that the untransformed coordinates are still in-bounds for the window.
   utils.setDisplayPortForElement(0, 0, 100, 100, subframe, 1);
   await promiseAllPaintsDone();
   var scrollY = 300;
   utils.setAsyncScrollOffset(subframe, 0, scrollY);
-  if (config.isWebRender) {
-    // Tick the refresh driver once to make sure the compositor has applied the
-    // async scroll offset (for APZ hit-testing this doesn't matter, but for
-    // WebRender hit-testing we need to make sure WR has the latest info).
-    utils.advanceTimeAndRefresh(16);
-    utils.restoreNormalRefresh();
-  }
+  // Tick the refresh driver once to make sure the compositor has applied the
+  // async scroll offset (for WebRender hit-testing we need to make sure WR has
+  // the latest info).
+  utils.advanceTimeAndRefresh(16);
+  utils.restoreNormalRefresh();
 
   // Scroll over the subframe, and make sure that the page does not scroll,
   // i.e. overscroll-behavior is respected.
   var waitForScroll = false; // don't wait for a scroll event, it will never come
   await promiseMoveMouseAndScrollWheelOver(subframe, 50, 50, waitForScroll);
   is(window.scrollY, 0, "overscroll-behavior was respected");
 }
 
--- a/gfx/layers/apz/test/mochitest/helper_scrollframe_activation_on_load.html
+++ b/gfx/layers/apz/test/mochitest/helper_scrollframe_activation_on_load.html
@@ -46,22 +46,20 @@ https://bugzilla.mozilla.org/show_bug.cg
       // At this time activateAllScrollFrames is only active with wr fission:
       // div displayPort: {"x":0,"y":0,"w":50,"h":50} wr fission
       // theDiv.clientWidth: 50 wr fission
       // theDiv.clientHeight: 50 wr fission
 
       let config = getHitTestConfig();
 
       let heightMultiplier = SpecialPowers.getCharPref("apz.y_stationary_size_multiplier");
-      if (config.isWebRender) {
-        // With WebRender, the effective height multiplier can be reduced
-        // for alignment reasons. The reduction should be no more than a
-        // factor of two.
-        heightMultiplier /= 2;
-      }
+      // With WebRender, the effective height multiplier can be reduced
+      // for alignment reasons. The reduction should be no more than a
+      // factor of two.
+      heightMultiplier /= 2;
       info("effective displayport height multipler is " + heightMultiplier);
 
       let rootDisplayPort = getLastContentDisplayportFor('root-element');
       let rootElement = document.getElementById('root-element');
       info("rootDisplayPort is " + JSON.stringify(rootDisplayPort));
       info("rootElement.clientWidth " + rootElement.clientWidth +
            " rootElement.clientHeight " + rootElement.clientHeight);
       ok(rootDisplayPort.w >= rootElement.clientWidth, "rootDisplayPort should be at least as wide as page");
--- a/gfx/layers/apz/test/mochitest/test_group_hittest-2.html
+++ b/gfx/layers/apz/test/mochitest/test_group_hittest-2.html
@@ -28,50 +28,35 @@ var prefs = [
 
 var overscroll_prefs = [...prefs,
                         ["apz.overscroll.enabled", true],
                         ["apz.overscroll.test_async_scroll_offset.enabled", true],
                         ["ui.prefersReducedMotion", 0],
                        ];
 
 var subtests = [
+  {"file": "helper_hittest_deep_scene_stack.html", "prefs": prefs},
   {"file": "helper_hittest_pointerevents_svg.html", "prefs": prefs},
   {"file": "helper_hittest_clippath.html", "prefs": prefs},
   {"file": "helper_hittest_hoisted_scrollinfo.html", "prefs": prefs},
   {"file": "helper_hittest_hidden_inactive_scrollframe.html", "prefs": prefs},
   {"file": "helper_hittest_overscroll.html", "prefs": overscroll_prefs},
   {"file": "helper_hittest_overscroll_subframe.html", "prefs": overscroll_prefs},
   {"file": "helper_hittest_overscroll_contextmenu.html", "prefs": overscroll_prefs},
   {"file": "helper_hittest_bug1715187.html", "prefs": prefs},
   {"file": "helper_hittest_bug1715369.html", "prefs": prefs},
   {"file": "helper_hittest_fixed_bg.html", "prefs": prefs},
   // This test should be at the end, because it's prone to timeout.
   {"file": "helper_hittest_spam.html", "prefs": prefs},
 ];
 
-function addConditionalTests(tests) {
-  // Add some more tests only useful with WebRender. Note that we do this in
-  // function run after loading, because trying to read layerManagerType can
-  // throw an NS_ERROR_FAILURE if called too early.
-  var utils = SpecialPowers.getDOMWindowUtils(window);
-  var isWebRender = utils.layerManagerType.startsWith("WebRender");
-  if (isWebRender) {
-    // Add new tests at the beginning, to ensure the final test remains in
-    // the final position.
-    tests = [
-      {"file": "helper_hittest_deep_scene_stack.html", "prefs": prefs},
-    ].concat(tests);
-  }
-  return tests;
-}
-
 if (isApzEnabled()) {
   SimpleTest.waitForExplicitFinish();
   window.onload = function() {
-    runSubtestsSeriallyInFreshWindows(addConditionalTests(subtests))
+    runSubtestsSeriallyInFreshWindows(subtests)
     .then(SimpleTest.finish, SimpleTest.finishWithFailure);
   };
 }
 
   </script>
 </head>
 <body>
 </body>
--- a/gfx/layers/apz/test/mochitest/test_layerization.html
+++ b/gfx/layers/apz/test/mochitest/test_layerization.html
@@ -59,22 +59,20 @@ async function scrollWheelOver(element) 
 }
 
 const DISPLAYPORT_EXPIRY = 100;
 
 let config = getHitTestConfig();
 let activateAllScrollFrames = config.activateAllScrollFrames;
 
 let heightMultiplier = SpecialPowers.getCharPref("apz.y_stationary_size_multiplier");
-if (config.isWebRender) {
-  // With WebRender, the effective height multiplier can be reduced
-  // for alignment reasons. The reduction should be no more than a
-  // factor of two.
-  heightMultiplier /= 2;
-}
+// With WebRender, the effective height multiplier can be reduced
+// for alignment reasons. The reduction should be no more than a
+// factor of two.
+heightMultiplier /= 2;
 info("effective displayport height multipler is " + heightMultiplier);
 
 function hasNonZeroMarginDisplayPort(elementId, containingDoc = null) {
   let dp = getLastContentDisplayportFor(elementId);
   if (dp == null) {
     return false;
   }
   let elt = (containingDoc != null ? containingDoc : document).getElementById(elementId);
--- a/gfx/layers/wr/WebRenderCommandBuilder.cpp
+++ b/gfx/layers/wr/WebRenderCommandBuilder.cpp
@@ -399,19 +399,17 @@ struct DIGroup {
          clippedBounds.y, clippedBounds.width, clippedBounds.height);
       GP("%d %d,  %f %f\n", mVisibleRect.TopLeft().x, mVisibleRect.TopLeft().y,
          aMatrix._11, aMatrix._22);
       GP("mRect %d %d %d %d\n", aData->mRect.x, aData->mRect.y,
          aData->mRect.width, aData->mRect.height);
       InvalidateRect(aData->mRect);
       aData->mInvalid = true;
       invalidated = true;
-    } else if (aData->mInvalid ||
-               /* XXX: handle image load invalidation */ (
-                   aItem->IsInvalid(invalid) && invalid.IsEmpty())) {
+    } else if (aItem->IsInvalid(invalid) && invalid.IsEmpty()) {
       UniquePtr<nsDisplayItemGeometry> geometry(
           aItem->AllocateGeometry(aBuilder));
       nsRect clippedBounds = clip.ApplyNonRoundedIntersection(
           geometry->ComputeInvalidationRegion());
       aData->mGeometry = std::move(geometry);
 
       GP("matrix: %f %f\n", aMatrix._31, aMatrix._32);
       GP("frame invalid invalidate: %s\n", aItem->Name());
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -476,16 +476,23 @@ void gfxPlatform::InitChild(const Conten
   // routines, so they don't have to do a sync request from the parent.
   gContentDeviceInitData = &aData;
   Init();
   gContentDeviceInitData = nullptr;
 }
 
 #define WR_DEBUG_PREF "gfx.webrender.debug"
 
+static void SwapIntervalPrefChangeCallback(const char* aPrefName, void*) {
+  bool egl = Preferences::GetBool("gfx.swap-interval.egl", false);
+  bool glx = Preferences::GetBool("gfx.swap-interval.glx", false);
+  gfxVars::SetSwapIntervalEGL(egl);
+  gfxVars::SetSwapIntervalGLX(glx);
+}
+
 static void WebRendeProfilerUIPrefChangeCallback(const char* aPrefName, void*) {
   nsCString uiString;
   if (NS_SUCCEEDED(Preferences::GetCString("gfx.webrender.debug.profiler-ui",
                                            uiString))) {
     gfxVars::SetWebRenderProfilerUI(uiString);
   }
 }
 
@@ -2566,16 +2573,19 @@ void gfxPlatform::InitWebRenderConfig() 
     gfxVars::SetUseWebRenderProgramBinaryDisk(hasWebRender);
   }
 
   gfxVars::SetUseWebRenderOptimizedShaders(
       gfxConfig::IsEnabled(Feature::WEBRENDER_OPTIMIZED_SHADERS));
 
   gfxVars::SetUseSoftwareWebRender(!hasHardware && hasSoftware);
 
+  Preferences::RegisterPrefixCallbackAndCall(SwapIntervalPrefChangeCallback,
+                                             "gfx.swap-interval");
+
   // gfxFeature is not usable in the GPU process, so we use gfxVars to transmit
   // this feature
   if (hasWebRender) {
     gfxVars::SetUseWebRender(true);
     reporter.SetSuccessful();
 
     Preferences::RegisterPrefixCallbackAndCall(WebRenderDebugPrefChangeCallback,
                                                WR_DEBUG_PREF);
--- a/gfx/webrender_bindings/RenderCompositorEGL.cpp
+++ b/gfx/webrender_bindings/RenderCompositorEGL.cpp
@@ -186,18 +186,19 @@ bool RenderCompositorEGL::Resume() {
     if (mEGLSurface != EGL_NO_SURFACE) {
       // We have a new EGL surface, which on wayland needs to be configured for
       // non-blocking buffer swaps. We need MakeCurrent() to set our current EGL
       // context before we call eglSwapInterval, which is why we do it here
       // rather than where the surface was created.
       const auto& gle = gl::GLContextEGL::Cast(gl());
       const auto& egl = gle->mEgl;
       MakeCurrent();
-      // Make eglSwapBuffers() non-blocking on wayland.
-      egl->fSwapInterval(0);
+
+      const int interval = gfx::gfxVars::SwapIntervalEGL() ? 1 : 0;
+      egl->fSwapInterval(interval);
     } else {
       RenderThread::Get()->HandleWebRenderError(WebRenderError::NEW_SURFACE);
       return false;
     }
   }
   return true;
 }
 
--- a/intl/lwbrk/LineBreaker.cpp
+++ b/intl/lwbrk/LineBreaker.cpp
@@ -365,21 +365,22 @@ static inline int IS_CJK_CHAR(char32_t u
 static inline bool IS_NONBREAKABLE_SPACE(char16_t u) {
   return u == 0x00A0 || u == 0x2007;  // NO-BREAK SPACE, FIGURE SPACE
 }
 
 static inline bool IS_HYPHEN(char16_t u) {
   return (u == U_HYPHEN || u == 0x2010 ||  // HYPHEN
           u == 0x2012 ||                   // FIGURE DASH
           u == 0x2013 ||                   // EN DASH
-#if ANDROID
-          /* Bug 1647377: On Android, we don't have a "platform" backend
-           * that supports Tibetan (nsRuleBreaker.cpp only knows about
-           * Thai), so instead we just treat the TSHEG like a hyphen to
-           * provide basic line-breaking possibilities.
+#if ANDROID || XP_WIN
+          /* Bug 1647377: On Android and Windows, we don't have a "platform"
+           * backend that supports Tibetan (nsRuleBreaker.cpp only knows about
+           * Thai, and ScriptBreak doesn't handle Tibetan well either), so
+           * instead we just treat the TSHEG like a hyphen to provide basic
+           * line-breaking possibilities.
            */
           u == 0x0F0B ||  // TIBETAN MARK INTERSYLLABIC TSHEG
 #endif
           u == 0x058A);  // ARMENIAN HYPHEN
 }
 
 static int8_t GetClass(uint32_t u, LineBreaker::Strictness aLevel,
                        bool aIsChineseOrJapanese) {
--- a/intl/lwbrk/LineBreaker.h
+++ b/intl/lwbrk/LineBreaker.h
@@ -71,18 +71,18 @@ static inline bool NS_IsSpace(char16_t u
                                           // HAIR SPACE, ZERO WIDTH SPACE
          u == 0x1361 ||                   // ETHIOPIC WORDSPACE
          u == 0x1680 ||                   // OGHAM SPACE MARK
          u == 0x205F;                     // MEDIUM MATHEMATICAL SPACE
 }
 
 static inline bool NS_NeedsPlatformNativeHandling(char16_t aChar) {
   return
-#if ANDROID  // Bug 1647377: no "platform native" support for Tibetan;
-             // better to just use our class-based breaker.
+#if ANDROID || XP_WIN // Bug 1647377/1736393: no "platform native" support for
+                      // Tibetan; better to just use our class-based breaker.
       (0x0e01 <= aChar && aChar <= 0x0eff) ||  // Thai, Lao
 #else
       (0x0e01 <= aChar && aChar <= 0x0fff) ||  // Thai, Lao, Tibetan
 #endif
       (0x1780 <= aChar && aChar <= 0x17ff);  // Khmer
 }
 
 }  // namespace intl
--- a/js/public/GCHashTable.h
+++ b/js/public/GCHashTable.h
@@ -74,30 +74,31 @@ class GCHashMap : public js::HashMap<Key
   void trace(JSTracer* trc) {
     for (typename Base::Enum e(*this); !e.empty(); e.popFront()) {
       GCPolicy<Value>::trace(trc, &e.front().value(), "hashmap value");
       GCPolicy<Key>::trace(trc, &e.front().mutableKey(), "hashmap key");
     }
   }
 
   void sweep() {
-    typename Base::Enum e(*this);
-    sweepEntries(e);
-  }
-
-  void sweepEntries(typename Base::Enum& e) {
-    for (; !e.empty(); e.popFront()) {
+    for (typename Base::Enum e(*this); !e.empty(); e.popFront()) {
       if (MapSweepPolicy::needsSweep(&e.front().mutableKey(),
                                      &e.front().value())) {
         e.removeFront();
       }
     }
   }
 
-  void traceWeak(JSTracer* trc) {
+  bool traceWeak(JSTracer* trc) {
+    typename Base::Enum e(*this);
+    traceWeakEntries(trc, e);
+    return !this->empty();
+  }
+
+  void traceWeakEntries(JSTracer* trc, typename Base::Enum& e) {
     for (typename Base::Enum e(*this); !e.empty(); e.popFront()) {
       if (!MapSweepPolicy::traceWeak(trc, &e.front().mutableKey(),
                                      &e.front().value())) {
         e.removeFront();
       }
     }
   }
 
@@ -144,25 +145,26 @@ class GCRekeyableHashMap : public JS::GC
       if (MapSweepPolicy::needsSweep(&key, &e.front().value())) {
         e.removeFront();
       } else if (!HashPolicy::match(key, e.front().key())) {
         e.rekeyFront(key);
       }
     }
   }
 
-  void traceWeak(JSTracer* trc) {
+  bool traceWeak(JSTracer* trc) {
     for (typename Base::Enum e(*this); !e.empty(); e.popFront()) {
       Key key(e.front().key());
       if (!MapSweepPolicy::traceWeak(trc, &key, &e.front().value())) {
         e.removeFront();
       } else if (!HashPolicy::match(key, e.front().key())) {
         e.rekeyFront(key);
       }
     }
+    return !this->empty();
   }
 
   // GCRekeyableHashMap is movable
   GCRekeyableHashMap(GCRekeyableHashMap&& rhs) : Base(std::move(rhs)) {}
   void operator=(GCRekeyableHashMap&& rhs) {
     MOZ_ASSERT(this != &rhs, "self-move assignment is prohibited");
     Base::operator=(std::move(rhs));
   }
@@ -270,31 +272,24 @@ class GCHashSet : public js::HashSet<T, 
   GCHashSet(AllocPolicy a, size_t length) : Base(std::move(a), length) {}
 
   void trace(JSTracer* trc) {
     for (typename Base::Enum e(*this); !e.empty(); e.popFront()) {
       GCPolicy<T>::trace(trc, &e.mutableFront(), "hashset element");
     }
   }
 
-  void sweep() {
+  bool traceWeak(JSTracer* trc) {
     typename Base::Enum e(*this);
-    sweepEntries(e);
+    traceWeakEntries(trc, e);
+    return !this->empty();
   }
 
-  void sweepEntries(typename Base::Enum& e) {
+  void traceWeakEntries(JSTracer* trc, typename Base::Enum& e) {
     for (; !e.empty(); e.popFront()) {
-      if (GCPolicy<T>::needsSweep(&e.mutableFront())) {
-        e.removeFront();
-      }
-    }
-  }
-
-  void traceWeak(JSTracer* trc) {
-    for (typename Base::Enum e(*this); !e.empty(); e.popFront()) {
       if (!GCPolicy<T>::traceWeak(trc, &e.mutableFront())) {
         e.removeFront();
       }
     }
   }
 
   // GCHashSet is movable
   GCHashSet(GCHashSet&& rhs) : Base(std::move(rhs)) {}
@@ -399,145 +394,149 @@ class MutableWrappedPtrOperations<JS::GC
 
 namespace JS {
 
 // Specialize WeakCache for GCHashMap to provide a barriered map that does not
 // need to be swept immediately.
 template <typename Key, typename Value, typename HashPolicy,
           typename AllocPolicy, typename MapSweepPolicy>
 class WeakCache<GCHashMap<Key, Value, HashPolicy, AllocPolicy, MapSweepPolicy>>
-    : protected detail::WeakCacheBase {
+    final : protected detail::WeakCacheBase {
   using Map = GCHashMap<Key, Value, HashPolicy, AllocPolicy, MapSweepPolicy>;
   using Self = WeakCache<Map>;
 
   Map map;
-  bool needsBarrier;
+  JSTracer* barrierTracer = nullptr;
 
  public:
   template <typename... Args>
   explicit WeakCache(Zone* zone, Args&&... args)
-      : WeakCacheBase(zone),
-        map(std::forward<Args>(args)...),
-        needsBarrier(false) {}
+      : WeakCacheBase(zone), map(std::forward<Args>(args)...) {}
   template <typename... Args>
   explicit WeakCache(JSRuntime* rt, Args&&... args)
-      : WeakCacheBase(rt),
-        map(std::forward<Args>(args)...),
-        needsBarrier(false) {}
-  ~WeakCache() { MOZ_ASSERT(!needsBarrier); }
+      : WeakCacheBase(rt), map(std::forward<Args>(args)...) {}
+  ~WeakCache() { MOZ_ASSERT(!barrierTracer); }
 
   bool empty() override { return map.empty(); }
 
-  size_t sweep(js::gc::StoreBuffer* sbToLock) override {
+  size_t traceWeak(JSTracer* trc, js::gc::StoreBuffer* sbToLock) override {
     size_t steps = map.count();
 
     // Create an Enum and sweep the table entries.
     mozilla::Maybe<typename Map::Enum> e;
     e.emplace(map);
-    map.sweepEntries(e.ref());
+    map.traceWeakEntries(trc, e.ref());
 
     // Potentially take a lock while the Enum's destructor is called as this can
     // rehash/resize the table and access the store buffer.
     mozilla::Maybe<js::gc::AutoLockStoreBuffer> lock;
     if (sbToLock) {
       lock.emplace(sbToLock);
     }
     e.reset();
 
     return steps;
   }
 
-  bool setNeedsIncrementalBarrier(bool needs) override {
-    MOZ_ASSERT(needsBarrier != needs);
-    needsBarrier = needs;
+  bool setIncrementalBarrierTracer(JSTracer* trc) override {
+    MOZ_ASSERT(bool(barrierTracer) != bool(trc));
+    barrierTracer = trc;
     return true;
   }
 
-  bool needsIncrementalBarrier() const override { return needsBarrier; }
+  bool needsIncrementalBarrier() const override { return barrierTracer; }
 
  private:
   using Entry = typename Map::Entry;
 
-  static bool entryNeedsSweep(const Entry& prior) {
+  static bool entryNeedsSweep(JSTracer* barrierTracer, const Entry& prior) {
     Key key(prior.key());
     Value value(prior.value());
-    bool result = MapSweepPolicy::needsSweep(&key, &value);
-    MOZ_ASSERT(prior.key() == key);      // We shouldn't update here.
-    MOZ_ASSERT(prior.value() == value);  // We shouldn't update here.
-    return result;
+    bool needsSweep = !MapSweepPolicy::traceWeak(barrierTracer, &key, &value);
+    MOZ_ASSERT_IF(!needsSweep,
+                  prior.key() == key);  // We shouldn't update here.
+    MOZ_ASSERT_IF(!needsSweep,
+                  prior.value() == value);  // We shouldn't update here.
+    return needsSweep;
   }
 
  public:
   using Lookup = typename Map::Lookup;
   using Ptr = typename Map::Ptr;
   using AddPtr = typename Map::AddPtr;
 
+  // Iterator over the whole collection.
   struct Range {
-    explicit Range(const typename Map::Range& r) : range(r) { settle(); }
+    explicit Range(Self& self) : cache(self), range(self.map.all()) {
+      settle();
+    }
     Range() = default;
 
     bool empty() const { return range.empty(); }
     const Entry& front() const { return range.front(); }
 
     void popFront() {
       range.popFront();
       settle();
     }
 
    private:
+    Self& cache;
     typename Map::Range range;
 
     void settle() {
-      while (!empty() && entryNeedsSweep(front())) {
-        popFront();
+      if (JSTracer* trc = cache.barrierTracer) {
+        while (!empty() && entryNeedsSweep(trc, front())) {
+          popFront();
+        }
       }
     }
   };
 
   struct Enum : public Map::Enum {
     explicit Enum(Self& cache) : Map::Enum(cache.map) {
       // This operation is not allowed while barriers are in place as we
       // may also need to enumerate the set for sweeping.
-      MOZ_ASSERT(!cache.needsBarrier);
+      MOZ_ASSERT(!cache.barrierTracer);
     }
   };
 
   Ptr lookup(const Lookup& l) const {
     Ptr ptr = map.lookup(l);
-    if (needsBarrier && ptr && entryNeedsSweep(*ptr)) {
+    if (barrierTracer && ptr && entryNeedsSweep(barrierTracer, *ptr)) {
       const_cast<Map&>(map).remove(ptr);
       return Ptr();
     }
     return ptr;
   }
 
   AddPtr lookupForAdd(const Lookup& l) {
     AddPtr ptr = map.lookupForAdd(l);
-    if (needsBarrier && ptr && entryNeedsSweep(*ptr)) {
+    if (barrierTracer && ptr && entryNeedsSweep(barrierTracer, *ptr)) {
       const_cast<Map&>(map).remove(ptr);
       return map.lookupForAdd(l);
     }
     return ptr;
   }
 
-  Range all() const { return Range(map.all()); }
+  Range all() const { return Range(*const_cast<Self*>(this)); }
 
   bool empty() const {
     // This operation is not currently allowed while barriers are in place
     // as it would require iterating the map and the caller expects a
     // constant time operation.
-    MOZ_ASSERT(!needsBarrier);
+    MOZ_ASSERT(!barrierTracer);
     return map.empty();
   }
 
   uint32_t count() const {
     // This operation is not currently allowed while barriers are in place
     // as it would require iterating the set and the caller expects a
     // constant time operation.
-    MOZ_ASSERT(!needsBarrier);
+    MOZ_ASSERT(!barrierTracer);
     return map.count();
   }
 
   size_t capacity() const { return map.capacity(); }
 
   bool has(const Lookup& l) const { return lookup(l).found(); }
 
   size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
@@ -545,24 +544,24 @@ class WeakCache<GCHashMap<Key, Value, Ha
   }
   size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
     return mallocSizeOf(this) + map.shallowSizeOfExcludingThis(mallocSizeOf);
   }
 
   void clear() {
     // This operation is not currently allowed while barriers are in place
     // since it doesn't make sense to clear a cache while it is being swept.
-    MOZ_ASSERT(!needsBarrier);
+    MOZ_ASSERT(!barrierTracer);
     map.clear();
   }
 
   void clearAndCompact() {
     // This operation is not currently allowed while barriers are in place
     // since it doesn't make sense to clear a cache while it is being swept.
-    MOZ_ASSERT(!needsBarrier);
+    MOZ_ASSERT(!barrierTracer);
     map.clearAndCompact();
   }
 
   void remove(Ptr p) {
     // This currently supports removing entries during incremental
     // sweeping. If we allow these tables to be swept incrementally this may
     // no longer be possible.
     map.remove(p);
@@ -595,145 +594,147 @@ class WeakCache<GCHashMap<Key, Value, Ha
   bool putNew(KeyInput&& k, ValueInput&& v) {
     return map.putNew(std::forward<KeyInput>(k), std::forward<ValueInput>(v));
   }
 } JS_HAZ_NON_GC_POINTER;
 
 // Specialize WeakCache for GCHashSet to provide a barriered set that does not
 // need to be swept immediately.
 template <typename T, typename HashPolicy, typename AllocPolicy>
-class WeakCache<GCHashSet<T, HashPolicy, AllocPolicy>>
+class WeakCache<GCHashSet<T, HashPolicy, AllocPolicy>> final
     : protected detail::WeakCacheBase {
   using Set = GCHashSet<T, HashPolicy, AllocPolicy>;
   using Self = WeakCache<Set>;
 
   Set set;
-  bool needsBarrier;
+  JSTracer* barrierTracer = nullptr;
 
  public:
   using Entry = typename Set::Entry;
 
   template <typename... Args>
   explicit WeakCache(Zone* zone, Args&&... args)
-      : WeakCacheBase(zone),
-        set(std::forward<Args>(args)...),
-        needsBarrier(false) {}
+      : WeakCacheBase(zone), set(std::forward<Args>(args)...) {}
   template <typename... Args>
   explicit WeakCache(JSRuntime* rt, Args&&... args)
-      : WeakCacheBase(rt),
-        set(std::forward<Args>(args)...),
-        needsBarrier(false) {}
+      : WeakCacheBase(rt), set(std::forward<Args>(args)...) {}
 
-  size_t sweep(js::gc::StoreBuffer* sbToLock) override {
+  size_t traceWeak(JSTracer* trc, js::gc::StoreBuffer* sbToLock) override {
     size_t steps = set.count();
 
     // Create an Enum and sweep the table entries. It's not necessary to take
     // the store buffer lock yet.
     mozilla::Maybe<typename Set::Enum> e;
     e.emplace(set);
-    set.sweepEntries(e.ref());
+    set.traceWeakEntries(trc, e.ref());
 
     // Destroy the Enum, potentially rehashing or resizing the table. Since this
     // can access the store buffer, we need to take a lock for this if we're
     // called off main thread.
     mozilla::Maybe<js::gc::AutoLockStoreBuffer> lock;
     if (sbToLock) {
       lock.emplace(sbToLock);
     }
     e.reset();
 
     return steps;
   }
 
   bool empty() override { return set.empty(); }
 
-  bool setNeedsIncrementalBarrier(bool needs) override {
-    MOZ_ASSERT(needsBarrier != needs);
-    needsBarrier = needs;
+  bool setIncrementalBarrierTracer(JSTracer* trc) override {
+    MOZ_ASSERT(bool(barrierTracer) != bool(trc));
+    barrierTracer = trc;
     return true;
   }
 
-  bool needsIncrementalBarrier() const override { return needsBarrier; }
+  bool needsIncrementalBarrier() const override { return barrierTracer; }
 
  private:
-  static bool entryNeedsSweep(const Entry& prior) {
+  static bool entryNeedsSweep(JSTracer* barrierTracer, const Entry& prior) {
     Entry entry(prior);
-    bool result = GCPolicy<T>::needsSweep(&entry);
-    MOZ_ASSERT(prior == entry);  // We shouldn't update here.
-    return result;
+    bool needsSweep = !GCPolicy<T>::traceWeak(barrierTracer, &entry);
+    MOZ_ASSERT_IF(!needsSweep, prior == entry);  // We shouldn't update here.
+    return needsSweep;
   }
 
  public:
   using Lookup = typename Set::Lookup;
   using Ptr = typename Set::Ptr;
   using AddPtr = typename Set::AddPtr;
 
+  // Iterator over the whole collection.
   struct Range {
-    explicit Range(const typename Set::Range& r) : range(r) { settle(); }
+    explicit Range(Self& self) : cache(self), range(self.set.all()) {
+      settle();
+    }
     Range() = default;
 
     bool empty() const { return range.empty(); }
     const Entry& front() const { return range.front(); }
 
     void popFront() {
       range.popFront();
       settle();
     }
 
    private:
+    Self& cache;
     typename Set::Range range;
 
     void settle() {
-      while (!empty() && entryNeedsSweep(front())) {
-        popFront();
+      if (JSTracer* trc = cache.barrierTracer) {
+        while (!empty() && entryNeedsSweep(trc, front())) {
+          popFront();
+        }
       }
     }
   };
 
   struct Enum : public Set::Enum {
     explicit Enum(Self& cache) : Set::Enum(cache.set) {
       // This operation is not allowed while barriers are in place as we
       // may also need to enumerate the set for sweeping.
-      MOZ_ASSERT(!cache.needsBarrier);
+      MOZ_ASSERT(!cache.barrierTracer);
     }
   };
 
   Ptr lookup(const Lookup& l) const {
     Ptr ptr = set.lookup(l);
-    if (needsBarrier && ptr && entryNeedsSweep(*ptr)) {
+    if (barrierTracer && ptr && entryNeedsSweep(barrierTracer, *ptr)) {
       const_cast<Set&>(set).remove(ptr);
       return Ptr();
     }
     return ptr;
   }
 
   AddPtr lookupForAdd(const Lookup& l) {
     AddPtr ptr = set.lookupForAdd(l);
-    if (needsBarrier && ptr && entryNeedsSweep(*ptr)) {
+    if (barrierTracer && ptr && entryNeedsSweep(barrierTracer, *ptr)) {
       const_cast<Set&>(set).remove(ptr);
       return set.lookupForAdd(l);
     }
     return ptr;
   }
 
-  Range all() const { return Range(set.all()); }
+  Range all() const { return Range(*const_cast<Self*>(this)); }
 
   bool empty() const {
     // This operation is not currently allowed while barriers are in place
     // as it would require iterating the set and the caller expects a
     // constant time operation.
-    MOZ_ASSERT(!needsBarrier);
+    MOZ_ASSERT(!barrierTracer);
     return set.empty();
   }
 
   uint32_t count() const {
     // This operation is not currently allowed while barriers are in place
     // as it would require iterating the set and the caller expects a
     // constant time operation.
-    MOZ_ASSERT(!needsBarrier);
+    MOZ_ASSERT(!barrierTracer);
     return set.count();
   }
 
   size_t capacity() const { return set.capacity(); }
 
   bool has(const Lookup& l) const { return lookup(l).found(); }
 
   size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
@@ -741,24 +742,24 @@ class WeakCache<GCHashSet<T, HashPolicy,
   }
   size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
     return mallocSizeOf(this) + set.shallowSizeOfExcludingThis(mallocSizeOf);
   }
 
   void clear() {
     // This operation is not currently allowed while barriers are in place
     // since it doesn't make sense to clear a cache while it is being swept.
-    MOZ_ASSERT(!needsBarrier);
+    MOZ_ASSERT(!barrierTracer);
     set.clear();
   }
 
   void clearAndCompact() {
     // This operation is not currently allowed while barriers are in place
     // since it doesn't make sense to clear a cache while it is being swept.
-    MOZ_ASSERT(!needsBarrier);
+    MOZ_ASSERT(!barrierTracer);
     set.clearAndCompact();
   }
 
   void remove(Ptr p) {
     // This currently supports removing entries during incremental
     // sweeping. If we allow these tables to be swept incrementally this may
     // no longer be possible.
     set.remove(p);
--- a/js/public/SweepingAPI.h
+++ b/js/public/SweepingAPI.h
@@ -55,22 +55,24 @@ class WeakCacheBase : public mozilla::Li
   explicit WeakCacheBase(const WeakCacheBase&) = delete;
 
  public:
   explicit WeakCacheBase(Zone* zone) { shadow::RegisterWeakCache(zone, this); }
   explicit WeakCacheBase(JSRuntime* rt) { shadow::RegisterWeakCache(rt, this); }
   WeakCacheBase(WeakCacheBase&& other) = default;
   virtual ~WeakCacheBase() = default;
 
-  virtual size_t sweep(js::gc::StoreBuffer* sbToLock) = 0;
+  virtual size_t traceWeak(JSTracer* trc, js::gc::StoreBuffer* sbToLock) = 0;
 
   // Sweeping will be skipped if the cache is empty already.
   virtual bool empty() = 0;
 
-  virtual bool setNeedsIncrementalBarrier(bool needs) {
+  // Enable/disable read barrier during incremental sweeping and set the tracer
+  // to use.
+  virtual bool setIncrementalBarrierTracer(JSTracer* trc) {
     // Derived classes do not support incremental barriers by default.
     return false;
   }
   virtual bool needsIncrementalBarrier() const {
     // Derived classes do not support incremental barriers by default.
     return false;
   }
 };
@@ -93,26 +95,26 @@ class WeakCache : protected detail::Weak
       : WeakCacheBase(zone), cache(std::forward<Args>(args)...) {}
   template <typename... Args>
   explicit WeakCache(JSRuntime* rt, Args&&... args)
       : WeakCacheBase(rt), cache(std::forward<Args>(args)...) {}
 
   const T& get() const { return cache; }
   T& get() { return cache; }
 
-  size_t sweep(js::gc::StoreBuffer* sbToLock) override {
+  size_t traceWeak(JSTracer* trc, js::gc::StoreBuffer* sbToLock) override {
     // Take the store buffer lock in case sweeping triggers any generational
     // post barriers. This is not always required and WeakCache specializations
     // may delay or skip taking the lock as appropriate.
     mozilla::Maybe<js::gc::AutoLockStoreBuffer> lock;
     if (sbToLock) {
       lock.emplace(sbToLock);
     }
 
-    GCPolicy<T>::sweep(&cache);
+    GCPolicy<T>::traceWeak(trc, &cache);
     return 0;
   }
 
   bool empty() override { return cache.empty(); }
 } JS_HAZ_NON_GC_POINTER;
 
 }  // namespace JS
 
--- a/js/src/gc/Compacting.cpp
+++ b/js/src/gc/Compacting.cpp
@@ -454,21 +454,20 @@ void Zone::prepareForCompacting() {
   discardJitCode(fop);
 }
 
 void GCRuntime::sweepZoneAfterCompacting(MovingTracer* trc, Zone* zone) {
   MOZ_ASSERT(zone->isCollecting());
   traceWeakFinalizationRegistryEdges(trc, zone);
   zone->weakRefMap().sweep(&storeBuffer());
 
-  {
-    zone->sweepWeakMaps();
-    for (auto* cache : zone->weakCaches()) {
-      cache->sweep(nullptr);
-    }
+  zone->traceWeakMaps(trc);
+
+  for (auto* cache : zone->weakCaches()) {
+    cache->traceWeak(trc, nullptr);
   }
 
   if (jit::JitZone* jitZone = zone->jitZone()) {
     jitZone->traceWeak(trc);
   }
 
   for (RealmsInZoneIter r(zone); !r.done(); r.next()) {
     r->traceWeakRegExps(trc);
@@ -651,17 +650,17 @@ static AllocKinds ForegroundUpdateKinds(
 }
 
 void GCRuntime::updateRttValueObjects(MovingTracer* trc, Zone* zone) {
   // We need to update each type descriptor object and any objects stored in
   // its reserved slots, since some of these contain array objects that also
   // need to be updated. Do not update any non-reserved slots, since they might
   // point back to unprocessed descriptor objects.
 
-  zone->rttValueObjects().sweep(nullptr);
+  zone->rttValueObjects().traceWeak(trc, nullptr);
 
   for (auto r = zone->rttValueObjects().all(); !r.empty(); r.popFront()) {
     RttValue* obj = &MaybeForwardedObjectAs<RttValue>(r.front());
     UpdateCellPointers(trc, obj);
     for (size_t i = 0; i < RttValue::SlotCount; i++) {
       Value value = obj->getSlot(i);
       if (value.isObject()) {
         UpdateCellPointers(trc, &value.toObject());
@@ -792,23 +791,16 @@ void GCRuntime::updateZonePointersToRelo
   zone->shapeZone().purgeShapeCaches(rt->defaultFreeOp());
   rt->caches().stringToAtomCache.purge();
 
   // Iterate through all cells that can contain relocatable pointers to update
   // them. Since updating each cell is independent we try to parallelize this
   // as much as possible.
   updateAllCellPointers(&trc, zone);
 
-  // Mark roots to update them.
-  {
-    gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_ROOTS);
-
-    WeakMapBase::traceZone(zone, &trc);
-  }
-
   // Sweep everything to fix up weak pointers.
   sweepZoneAfterCompacting(&trc, zone);
 
   // Call callbacks to get the rest of the system to fixup other untraced
   // pointers.
   for (CompartmentsInZoneIter comp(zone); !comp.done(); comp.next()) {
     callWeakPointerCompartmentCallbacks(comp);
   }
@@ -840,17 +832,17 @@ void GCRuntime::updateRuntimePointersToR
     traceEmbeddingGrayRoots(&trc);
     Compartment::traceIncomingCrossCompartmentEdgesForZoneGC(
         &trc, Compartment::GrayEdges);
   }
 
   // Sweep everything to fix up weak pointers.
   jit::JitRuntime::TraceWeakJitcodeGlobalTable(rt, &trc);
   for (JS::detail::WeakCacheBase* cache : rt->weakCaches()) {
-    cache->sweep(nullptr);
+    cache->traceWeak(&trc, nullptr);
   }
 
   // Type inference may put more blocks here to free.
   {
     AutoLockHelperThreadState lock;
     lifoBlocksToFree.ref().freeAll();
   }
 
--- a/js/src/gc/GC.cpp
+++ b/js/src/gc/GC.cpp
@@ -365,16 +365,17 @@ void GCRuntime::releaseArena(Arena* aren
 GCRuntime::GCRuntime(JSRuntime* rt)
     : rt(rt),
       atomsZone(nullptr),
       systemZone(nullptr),
       heapState_(JS::HeapState::Idle),
       stats_(this),
       marker(rt),
       barrierTracer(rt),
+      sweepingTracer(rt),
       heapSize(nullptr),
       helperThreadRatio(TuningDefaults::HelperThreadRatio),
       maxHelperThreads(TuningDefaults::MaxHelperThreads),
       helperThreadCount(1),
       rootsHash(256),
       nextCellUniqueId_(LargestTaggedNullCellPointer +
                         1),  // Ensure disjoint from null tagged pointers.
       numArenasFreeCommitted(0),
--- a/js/src/gc/GCInternals.h
+++ b/js/src/gc/GCInternals.h
@@ -274,25 +274,16 @@ struct MovingTracer final : public Gener
   explicit MovingTracer(JSRuntime* rt);
 
  private:
   template <typename T>
   T* onEdge(T* thingp);
   friend class GenericTracerImpl<MovingTracer>;
 };
 
-struct SweepingTracer final : public GenericTracerImpl<SweepingTracer> {
-  explicit SweepingTracer(JSRuntime* rt);
-
- private:
-  template <typename T>
-  T* onEdge(T* thingp);
-  friend class GenericTracerImpl<SweepingTracer>;
-};
-
 struct MinorSweepingTracer final
     : public GenericTracerImpl<MinorSweepingTracer> {
   explicit MinorSweepingTracer(JSRuntime* rt);
 
  private:
   template <typename T>
   T* onEdge(T* thingp);
   friend class GenericTracerImpl<MinorSweepingTracer>;
--- a/js/src/gc/GCRuntime.h
+++ b/js/src/gc/GCRuntime.h
@@ -266,16 +266,25 @@ class BarrierTracer final : public Gener
   T* onEdge(T* thing);
   friend class GenericTracerImpl<BarrierTracer>;
 
   void handleBufferFull(JS::GCCellPtr cell);
 
   GCMarker& marker;
 };
 
+struct SweepingTracer final : public GenericTracerImpl<SweepingTracer> {
+  explicit SweepingTracer(JSRuntime* rt);
+
+ private:
+  template <typename T>
+  T* onEdge(T* thingp);
+  friend class GenericTracerImpl<SweepingTracer>;
+};
+
 class GCRuntime {
   friend GCMarker::MarkQueueProgress GCMarker::processMarkQueue();
 
  public:
   explicit GCRuntime(JSRuntime* rt);
   [[nodiscard]] bool init(uint32_t maxbytes);
   void finishRoots();
   void finish();
@@ -907,16 +916,17 @@ class GCRuntime {
 
   UnprotectedData<gcstats::Statistics> stats_;
 
  public:
   js::StringStats stringStats;
 
   GCMarker marker;
   BarrierTracer barrierTracer;
+  SweepingTracer sweepingTracer;
 
   Vector<JS::GCCellPtr, 0, SystemAllocPolicy> unmarkGrayStack;
 
   /* Track total GC heap size for this runtime. */
   HeapSize heapSize;
 
   /* GC scheduling state and parameters. */
   GCSchedulingTunables tunables;
--- a/js/src/gc/Sweeping.cpp
+++ b/js/src/gc/Sweeping.cpp
@@ -1172,17 +1172,18 @@ class ImmediateSweepWeakCacheTask : publ
   ImmediateSweepWeakCacheTask(ImmediateSweepWeakCacheTask&& other)
       : GCParallelTask(std::move(other)),
         zone(other.zone),
         cache(other.cache) {}
 
   void run(AutoLockHelperThreadState& lock) override {
     AutoUnlockHelperThreadState unlock(lock);
     AutoSetThreadIsSweeping threadIsSweeping(zone);
-    cache.sweep(&gc->storeBuffer());
+    SweepingTracer trc(gc->rt);
+    cache.traceWeak(&trc, &gc->storeBuffer());
   }
 };
 
 void GCRuntime::updateAtomsBitmap() {
   DenseBitmap marked;
   if (atomMarking.computeBitmapFromChunkMarkBits(rt, marked)) {
     for (GCZonesIter zone(this); !zone.done(); zone.next()) {
       atomMarking.refineZoneBitmapForCollectedZone(zone, marked);
@@ -1232,28 +1233,29 @@ void GCRuntime::sweepCompressionTasks() 
 
   // Attach finished compression tasks.
   AutoLockHelperThreadState lock;
   AttachFinishedCompressions(runtime, lock);
   SweepPendingCompressions(lock);
 }
 
 void GCRuntime::sweepWeakMaps() {
+  SweepingTracer trc(rt);
   AutoSetThreadIsSweeping threadIsSweeping;  // This may touch any zone.
   for (SweepGroupZonesIter zone(this); !zone.done(); zone.next()) {
     /* No need to look up any more weakmap keys from this sweep group. */
     AutoEnterOOMUnsafeRegion oomUnsafe;
     if (!zone->gcEphemeronEdges().clear()) {
       oomUnsafe.crash("clearing weak keys in beginSweepingSweepGroup()");
     }
 
     // Lock the storebuffer since this may access it when rehashing or resizing
     // the tables.
     AutoLockStoreBuffer lock(&storeBuffer());
-    zone->sweepWeakMaps();
+    zone->sweepWeakMaps(&trc);
   }
 }
 
 void GCRuntime::sweepUniqueIds() {
   for (SweepGroupZonesIter zone(this); !zone.done(); zone.next()) {
     AutoSetThreadIsSweeping threadIsSweeping(zone);
     zone->sweepUniqueIds();
   }
@@ -1401,45 +1403,47 @@ static inline bool IterateWeakCaches(JSR
 
 static bool PrepareWeakCacheTasks(JSRuntime* rt,
                                   WeakCacheTaskVector* immediateTasks) {
   // Start incremental sweeping for caches that support it or add to a vector
   // of sweep tasks to run on a helper thread.
 
   MOZ_ASSERT(immediateTasks->empty());
 
+  GCRuntime* gc = &rt->gc;
   bool ok =
       IterateWeakCaches(rt, [&](JS::detail::WeakCacheBase* cache, Zone* zone) {
         if (cache->empty()) {
           return true;
         }
 
         // Caches that support incremental sweeping will be swept later.
-        if (zone && cache->setNeedsIncrementalBarrier(true)) {
+        if (zone && cache->setIncrementalBarrierTracer(&gc->sweepingTracer)) {
           return true;
         }
 
-        return immediateTasks->emplaceBack(&rt->gc, zone, *cache);
+        return immediateTasks->emplaceBack(gc, zone, *cache);
       });
 
   if (!ok) {
     immediateTasks->clearAndFree();
   }
 
   return ok;
 }
 
 static void SweepAllWeakCachesOnMainThread(JSRuntime* rt) {
   // If we ran out of memory, do all the work on the main thread.
   gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::SWEEP_WEAK_CACHES);
+  SweepingTracer trc(rt);
   IterateWeakCaches(rt, [&](JS::detail::WeakCacheBase* cache, Zone* zone) {
     if (cache->needsIncrementalBarrier()) {
-      cache->setNeedsIncrementalBarrier(false);
+      cache->setIncrementalBarrierTracer(nullptr);
     }
-    cache->sweep(&rt->gc.storeBuffer());
+    cache->traceWeak(&trc, &rt->gc.storeBuffer());
     return true;
   });
 }
 
 void GCRuntime::sweepEmbeddingWeakPointers(JSFreeOp* fop) {
   using namespace gcstats;
 
   AutoLockStoreBuffer lock(&storeBuffer());
@@ -1838,18 +1842,20 @@ IncrementalProgress GCRuntime::sweepAtom
 }
 
 static size_t IncrementalSweepWeakCache(GCRuntime* gc,
                                         const WeakCacheToSweep& item) {
   AutoSetThreadIsSweeping threadIsSweeping(item.zone);
 
   JS::detail::WeakCacheBase* cache = item.cache;
   MOZ_ASSERT(cache->needsIncrementalBarrier());
-  size_t steps = cache->sweep(&gc->storeBuffer());
-  cache->setNeedsIncrementalBarrier(false);
+
+  SweepingTracer trc(gc->rt);
+  size_t steps = cache->traceWeak(&trc, &gc->storeBuffer());
+  cache->setIncrementalBarrierTracer(nullptr);
 
   return steps;
 }
 
 WeakCacheSweepIterator::WeakCacheSweepIterator(JS::Zone* sweepGroup)
     : sweepZone(sweepGroup), sweepCache(sweepZone->weakCaches().getFirst()) {
   settle();
 }
--- a/js/src/gc/WeakMap-inl.h
+++ b/js/src/gc/WeakMap-inl.h
@@ -331,20 +331,20 @@ bool WeakMap<K, V>::markEntries(GCMarker
       }
     }
   }
 
   return markedAny;
 }
 
 template <class K, class V>
-void WeakMap<K, V>::sweep() {
-  /* Remove all entries whose keys remain unmarked. */
+void WeakMap<K, V>::traceWeakEdges(JSTracer* trc) {
+  // Remove all entries whose keys remain unmarked.
   for (Enum e(*this); !e.empty(); e.popFront()) {
-    if (gc::IsAboutToBeFinalized(&e.front().mutableKey())) {
+    if (!TraceWeakEdge(trc, &e.front().mutableKey(), "WeakMap key")) {
       e.removeFront();
     }
   }
 
 #if DEBUG
   // Once we've swept, all remaining edges should stay within the known-live
   // part of the graph.
   assertEntriesNotAboutToBeFinalized();
--- a/js/src/gc/WeakMap.cpp
+++ b/js/src/gc/WeakMap.cpp
@@ -36,21 +36,21 @@ void WeakMapBase::unmarkZone(JS::Zone* z
   }
   MOZ_ASSERT(zone->gcNurseryEphemeronEdges().count() == 0);
 
   for (WeakMapBase* m : zone->gcWeakMapList()) {
     m->mapColor = CellColor::White;
   }
 }
 
-void WeakMapBase::traceZone(JS::Zone* zone, JSTracer* tracer) {
-  MOZ_ASSERT(tracer->weakMapAction() != JS::WeakMapTraceAction::Skip);
-  for (WeakMapBase* m : zone->gcWeakMapList()) {
-    m->trace(tracer);
-    TraceNullableEdge(tracer, &m->memberOf, "memberOf");
+void Zone::traceWeakMaps(JSTracer* trc) {
+  MOZ_ASSERT(trc->weakMapAction() != JS::WeakMapTraceAction::Skip);
+  for (WeakMapBase* m : gcWeakMapList()) {
+    m->trace(trc);
+    TraceNullableEdge(trc, &m->memberOf, "memberOf");
   }
 }
 
 #if defined(JS_GC_ZEAL) || defined(DEBUG)
 bool WeakMapBase::checkMarkingForZone(JS::Zone* zone) {
   // This is called at the end of marking.
   MOZ_ASSERT(zone->isGCMarking());
 
@@ -79,30 +79,30 @@ bool WeakMapBase::findSweepGroupEdgesFor
   for (WeakMapBase* m : zone->gcWeakMapList()) {
     if (!m->findSweepGroupEdges()) {
       return false;
     }
   }
   return true;
 }
 
-void WeakMapBase::sweepZone(JS::Zone* zone) {
-  for (WeakMapBase* m = zone->gcWeakMapList().getFirst(); m;) {
+void Zone::sweepWeakMaps(JSTracer* trc) {
+  for (WeakMapBase* m = gcWeakMapList().getFirst(); m;) {
     WeakMapBase* next = m->getNext();
     if (m->mapColor) {
-      m->sweep();
+      m->traceWeakEdges(trc);
     } else {
       m->clearAndCompact();
-      m->removeFrom(zone->gcWeakMapList());
+      m->removeFrom(gcWeakMapList());
     }
     m = next;
   }
 
 #ifdef DEBUG
-  for (WeakMapBase* m : zone->gcWeakMapList()) {
+  for (WeakMapBase* m : gcWeakMapList()) {
     MOZ_ASSERT(m->isInList() && m->mapColor);
   }
 #endif
 }
 
 void WeakMapBase::traceAllMappings(WeakMapTracer* tracer) {
   JSRuntime* rt = tracer->runtime;
   for (ZonesIter zone(rt, SkipAtoms); !zone.done(); zone.next()) {
--- a/js/src/gc/WeakMap.h
+++ b/js/src/gc/WeakMap.h
@@ -102,33 +102,26 @@ class WeakMapBase : public mozilla::Link
 
   JS::Zone* zone() const { return zone_; }
 
   // Garbage collector entry points.
 
   // Unmark all weak maps in a zone.
   static void unmarkZone(JS::Zone* zone);
 
-  // Trace all the weakmaps in a zone.
-  static void traceZone(JS::Zone* zone, JSTracer* tracer);
-
   // Check all weak maps in a zone that have been marked as live in this garbage
   // collection, and mark the values of all entries that have become strong
   // references to them. Return true if we marked any new values, indicating
   // that we need to make another pass. In other words, mark my marked maps'
   // marked members' mid-collection.
   static bool markZoneIteratively(JS::Zone* zone, GCMarker* marker);
 
   // Add zone edges for weakmaps with key delegates in a different zone.
   [[nodiscard]] static bool findSweepGroupEdgesForZone(JS::Zone* zone);
 
-  // Sweep the weak maps in a zone, removing dead weak maps and removing
-  // entries of live weak maps whose keys are dead.
-  static void sweepZone(JS::Zone* zone);
-
   // Sweep the marked weak maps in a zone, updating moved keys.
   static void sweepZoneAfterMinorGC(JS::Zone* zone);
 
   // Trace all weak map bindings. Used by the cycle collector.
   static void traceAllMappings(WeakMapTracer* tracer);
 
   // Save information about which weak maps are marked for a zone.
   static bool saveZoneMarkedWeakMaps(JS::Zone* zone,
@@ -141,17 +134,17 @@ class WeakMapBase : public mozilla::Link
   static bool checkMarkingForZone(JS::Zone* zone);
 #endif
 
  protected:
   // Instance member functions called by the above. Instantiations of WeakMap
   // override these with definitions appropriate for their Key and Value types.
   virtual void trace(JSTracer* tracer) = 0;
   virtual bool findSweepGroupEdges() = 0;
-  virtual void sweep() = 0;
+  virtual void traceWeakEdges(JSTracer* trc) = 0;
   virtual void traceMappings(WeakMapTracer* tracer) = 0;
   virtual void clearAndCompact() = 0;
 
   // We have a key that, if it or its delegate is marked, may lead to a WeakMap
   // value getting marked. Insert it or its delegate (if any) into the
   // appropriate zone's gcEphemeronEdges or gcNurseryEphemeronEdges.
   inline bool addImplicitEdges(gc::Cell* key, gc::Cell* delegate,
                                gc::TenuredCell* value);
@@ -311,17 +304,17 @@ class WeakMap
  private:
   void exposeGCThingToActiveJS(const JS::Value& v) const {
     JS::ExposeValueToActiveJS(v);
   }
   void exposeGCThingToActiveJS(JSObject* obj) const {
     JS::ExposeObjectToActiveJS(obj);
   }
 
-  void sweep() override;
+  void traceWeakEdges(JSTracer* trc) override;
 
   void clearAndCompact() override {
     Base::clear();
     Base::compact();
   }
 
   // memberOf can be nullptr, which means that the map is not part of a
   // JSObject.
--- a/js/src/gc/Zone.cpp
+++ b/js/src/gc/Zone.cpp
@@ -387,21 +387,16 @@ void Zone::checkStringWrappersAfterMovin
     CheckGCThingAfterMovingGC(key.get());
 
     auto ptr = crossZoneStringWrappers().lookup(key);
     MOZ_RELEASE_ASSERT(ptr.found() && &*ptr == &e.front());
   }
 }
 #endif
 
-void Zone::sweepWeakMaps() {
-  /* Finalize unreachable (key,value) pairs in all weak maps. */
-  WeakMapBase::sweepZone(this);
-}
-
 void Zone::discardJitCode(JSFreeOp* fop, const DiscardOptions& options) {
   if (!jitZone()) {
     return;
   }
 
   if (isPreservingCode()) {
     return;
   }
--- a/js/src/gc/Zone.h
+++ b/js/src/gc/Zone.h
@@ -475,19 +475,25 @@ class Zone : public js::ZoneAllocator, p
     return jitZone_ ? jitZone_ : createJitZone(cx);
   }
   js::jit::JitZone* jitZone() { return jitZone_; }
 
   void prepareForCompacting();
 
   void sweepAfterMinorGC(JSTracer* trc);
   void sweepUniqueIds();
-  void sweepWeakMaps();
   void sweepCompartments(JSFreeOp* fop, bool keepAtleastOne, bool lastGC);
 
+  // Remove dead weak maps from gcWeakMapList_ and remove entries from the
+  // remaining weak maps whose keys are dead.
+  void sweepWeakMaps(JSTracer* trc);
+
+  // Trace all weak maps in this zone. Used to update edges after a moving GC.
+  void traceWeakMaps(JSTracer* trc);
+
   js::gc::UniqueIdMap& uniqueIds() { return uniqueIds_.ref(); }
 
   void notifyObservingDebuggers();
 
   void clearTables();
 
   void addTenuredAllocsSinceMinorGC(uint32_t allocs) {
     tenuredAllocsSinceMinorGC_ += allocs;
--- a/js/src/jsapi-tests/testGCWeakCache.cpp
+++ b/js/src/jsapi-tests/testGCWeakCache.cpp
@@ -131,18 +131,19 @@ END_TEST(testWeakCacheGCVector)
 #ifdef JS_GC_ZEAL
 
 // A simple structure that embeds an object pointer. We cripple the hash
 // implementation so that we can test hash table collisions.
 struct ObjectEntry {
   HeapPtr<JSObject*> obj;
   explicit ObjectEntry(JSObject* o) : obj(o) {}
   bool operator==(const ObjectEntry& other) const { return obj == other.obj; }
-  bool needsSweep() {
-    return JS::GCPolicy<HeapPtr<JSObject*>>::needsSweep(&obj);
+  bool needsSweep() { return IsAboutToBeFinalized(&obj); }
+  bool traceWeak(JSTracer* trc) {
+    return TraceWeakEdge(trc, &obj, "ObjectEntry::obj");
   }
 };
 
 namespace js {
 template <>
 struct MovableCellHasher<ObjectEntry> {
   using Key = ObjectEntry;
   using Lookup = JSObject*;
@@ -168,18 +169,19 @@ struct MovableCellHasher<ObjectEntry> {
 struct NumberAndObjectEntry {
   uint32_t number;
   HeapPtr<JSObject*> obj;
 
   NumberAndObjectEntry(uint32_t n, JSObject* o) : number(n), obj(o) {}
   bool operator==(const NumberAndObjectEntry& other) const {
     return number == other.number && obj == other.obj;
   }
-  bool needsSweep() {
-    return JS::GCPolicy<HeapPtr<JSObject*>>::needsSweep(&obj);
+  bool needsSweep() { return IsAboutToBeFinalized(&obj); }
+  bool traceWeak(JSTracer* trc) {
+    return TraceWeakEdge(trc, &obj, "NumberAndObjectEntry::obj");
   }
 };
 
 struct NumberAndObjectLookup {
   uint32_t number;
   HeapPtr<JSObject*> obj;
 
   NumberAndObjectLookup(uint32_t n, JSObject* o) : number(n), obj(o) {}
--- a/js/src/shell/jsshell.h
+++ b/js/src/shell/jsshell.h
@@ -170,22 +170,21 @@ extern UniqueChars processWideModuleLoad
 bool CreateAlias(JSContext* cx, const char* dstName,
                  JS::HandleObject namespaceObj, const char* srcName);
 
 enum class ScriptKind { Script, ScriptStencil, DecodeScript, Module };
 
 class NonshrinkingGCObjectVector
     : public GCVector<HeapPtrObject, 0, SystemAllocPolicy> {
  public:
-  void sweep() {
+  bool traceWeak(JSTracer* trc) {
     for (HeapPtrObject& obj : *this) {
-      if (JS::GCPolicy<HeapPtrObject>::needsSweep(&obj)) {
-        obj = nullptr;
-      }
+      TraceWeakEdge(trc, &obj, "NonshrinkingGCObjectVector element");
     }
+    return true;
   }
 };
 
 using MarkBitObservers = JS::WeakCache<NonshrinkingGCObjectVector>;
 
 #ifdef SINGLESTEP_PROFILING
 using StackChars = Vector<char16_t, 0, SystemAllocPolicy>;
 #endif
--- a/js/src/vm/ArrayBufferObject.cpp
+++ b/js/src/vm/ArrayBufferObject.cpp
@@ -1726,37 +1726,37 @@ InnerViewTable::ViewVector* InnerViewTab
 
 void InnerViewTable::removeViews(ArrayBufferObject* buffer) {
   Map::Ptr p = map.lookup(buffer);
   MOZ_ASSERT(p);
 
   map.remove(p);
 }
 
-void InnerViewTable::sweep() { map.sweep(); }
+bool InnerViewTable::traceWeak(JSTracer* trc) { return map.traceWeak(trc); }
 
-void InnerViewTable::sweepAfterMinorGC() {
+void InnerViewTable::sweepAfterMinorGC(JSTracer* trc) {
   MOZ_ASSERT(needsSweepAfterMinorGC());
 
   if (nurseryKeysValid) {
     for (size_t i = 0; i < nurseryKeys.length(); i++) {
       JSObject* buffer = MaybeForwarded(nurseryKeys[i]);
       Map::Ptr p = map.lookup(buffer);
-      if (p && Map::SweepPolicy::needsSweep(&p->mutableKey(), &p->value())) {
+      if (p &&
+          !Map::SweepPolicy::traceWeak(trc, &p->mutableKey(), &p->value())) {
         map.remove(p);
       }
     }
-    nurseryKeys.clear();
   } else {
     // Do the required sweeping by looking at every map entry.
-    nurseryKeys.clear();
-    sweep();
+    map.traceWeak(trc);
+  }
 
-    nurseryKeysValid = true;
-  }
+  nurseryKeys.clear();
+  nurseryKeysValid = true;
 }
 
 size_t InnerViewTable::sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) {
   size_t vectorSize = 0;
   for (Map::Enum e(map); !e.empty(); e.popFront()) {
     vectorSize += e.front().value().sizeOfExcludingThis(mallocSizeOf);
   }
 
--- a/js/src/vm/ArrayBufferObject.h
+++ b/js/src/vm/ArrayBufferObject.h
@@ -559,18 +559,18 @@ class InnerViewTable {
   ViewVector* maybeViewsUnbarriered(ArrayBufferObject* obj);
   void removeViews(ArrayBufferObject* obj);
 
  public:
   explicit InnerViewTable(Zone* zone) : map(zone), nurseryKeysValid(true) {}
 
   // Remove references to dead objects in the table and update table entries
   // to reflect moved objects.
-  void sweep();
-  void sweepAfterMinorGC();
+  bool traceWeak(JSTracer* trc);
+  void sweepAfterMinorGC(JSTracer* trc);
 
   bool empty() const { return map.empty(); }
 
   bool needsSweepAfterMinorGC() const {
     return !nurseryKeys.empty() || !nurseryKeysValid;
   }
 
   size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf);
--- a/js/src/vm/Compartment.cpp
+++ b/js/src/vm/Compartment.cpp
@@ -499,17 +499,17 @@ void Compartment::traceIncomingCrossComp
     DebugAPI::traceCrossCompartmentEdges(trc);
   }
 }
 
 void Compartment::sweepAfterMinorGC(JSTracer* trc) {
   crossCompartmentObjectWrappers.sweepAfterMinorGC(trc);
 
   for (RealmsInCompartmentIter r(this); !r.done(); r.next()) {
-    r->sweepAfterMinorGC();
+    r->sweepAfterMinorGC(trc);
   }
 }
 
 // Remove dead wrappers from the table or update pointers to moved objects.
 void Compartment::traceCrossCompartmentObjectWrapperEdges(JSTracer* trc) {
   crossCompartmentObjectWrappers.traceWeak(trc);
 }
 
--- a/js/src/vm/Realm.cpp
+++ b/js/src/vm/Realm.cpp
@@ -321,27 +321,27 @@ void ObjectRealm::finishRoots() {
 void Realm::finishRoots() {
   if (debugEnvs_) {
     debugEnvs_->finish();
   }
 
   objects_.finishRoots();
 }
 
-void ObjectRealm::sweepAfterMinorGC() {
+void ObjectRealm::sweepAfterMinorGC(JSTracer* trc) {
   InnerViewTable& table = innerViews.get();
   if (table.needsSweepAfterMinorGC()) {
-    table.sweepAfterMinorGC();
+    table.sweepAfterMinorGC(trc);
   }
 }
 
-void Realm::sweepAfterMinorGC() {
+void Realm::sweepAfterMinorGC(JSTracer* trc) {
   globalWriteBarriered = 0;
   dtoaCache.purge();
-  objects_.sweepAfterMinorGC();
+  objects_.sweepAfterMinorGC(trc);
 }
 
 void Realm::traceWeakSavedStacks(JSTracer* trc) { savedStacks_.traceWeak(trc); }
 
 void Realm::traceWeakGlobalEdge(JSTracer* trc) {
   // If the global is dead, free its GlobalObjectData.
   auto result = TraceWeakEdge(trc, &global_, "Realm::global_");
   if (result.isDead()) {
--- a/js/src/vm/Realm.h
+++ b/js/src/vm/Realm.h
@@ -260,17 +260,17 @@ class ObjectRealm {
 
   explicit ObjectRealm(JS::Zone* zone);
   ~ObjectRealm();
 
   [[nodiscard]] bool init(JSContext* cx);
 
   void finishRoots();
   void trace(JSTracer* trc);
-  void sweepAfterMinorGC();
+  void sweepAfterMinorGC(JSTracer* trc);
   void traceWeakNativeIterators(JSTracer* trc);
 
   void addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf,
                               size_t* innerViewsArg,
                               size_t* objectMetadataTablesArg,
                               size_t* nonSyntacticLexicalEnvironmentsArg);
 
   MOZ_ALWAYS_INLINE bool objectMaybeInIteration(JSObject* obj);
@@ -513,17 +513,17 @@ class JS::Realm : public JS::shadow::Rea
    */
   void traceRoots(JSTracer* trc,
                   js::gc::GCRuntime::TraceOrMarkRuntime traceOrMark);
   /*
    * This method clears out tables of roots in preparation for the final GC.
    */
   void finishRoots();
 
-  void sweepAfterMinorGC();
+  void sweepAfterMinorGC(JSTracer* trc);
   void traceWeakDebugEnvironmentEdges(JSTracer* trc);
   void traceWeakObjectRealm(JSTracer* trc);
   void traceWeakRegExps(JSTracer* trc);
 
   void clearScriptCounts();
   void clearScriptLCov();
 
   void purge();
--- a/layout/docs/css-gap-decorations/Overview.bs
+++ b/layout/docs/css-gap-decorations/Overview.bs
@@ -77,17 +77,17 @@ The 'column-rule-image-source' and 'row-
         Initial: none
         Applies to: <a>multi-column containers</a>, <a>flex containers</a>, <a>grid containers</a>, <a spec=css-tables>table</a> and <a spec=css-tables>table-row-group</a> containers
         Inherited: no
         Percentages: N/A
         Computed value: the keyword ''column-rule-image-source/none'' or the computed <<image>>
         Animation type: discrete
     </pre>
 
-    These properties specifies an <<image>> to use in place of the rendering specified
+    These properties specify an <<image>> to use in place of the rendering specified
     by the ''column-rule-style''/''row-rule-style'' properties.
 
     As for borders, a rule image is not rendered when the corresponding ''column-rule-style''/''row-rule-style'' is ''column-rule-style/none''.
 
 The 'column-rule-image-slice' and 'row-rule-image-slice' Properties {#column-rule-image-slice}
 ----------------------------------------------------------------------------------------------
 
     <pre class=propdef>
@@ -96,17 +96,17 @@ The 'column-rule-image-slice' and 'row-r
         Initial: zero
         Applies to: <a>multi-column containers</a>, <a>flex containers</a>, <a>grid containers</a>, <a spec=css-tables>table</a> and <a spec=css-tables>table-row-group</a> containers
         Inherited: no
         Percentages: refer to size of the image
         Computed value: one or two values, each either a number or percentage
         Animation type: discrete
     </pre>
 
-    These properties specifies inward offsets from the top and bottom edges of the image,
+    These properties specify inward offsets from the top and bottom edges of the image,
     dividing it into three regions: two edge areas and one middle area.
 
     When two values are specified, they set the offsets on the top and bottom sides in
     that order. If the bottom is missing, it is the same as the top.
 
     <dl dfn-for=column-rule-image-slice dfn-type=value>
       <dt><dfn><<percentage [0,&infin;]>></dfn>
       <dd>Percentages are relative to the height of the image.
@@ -136,17 +136,17 @@ The 'column-rule-image-repeat' and 'row-
         Initial: stretch
         Applies to: <a>multi-column containers</a>, <a>flex containers</a>, <a>grid containers</a>, <a spec=css-tables>table</a> and <a spec=css-tables>table-row-group</a> containers
         Inherited: no
         Percentages: N/A
         Computed value: the specified keyword
         Animation type: discrete
     </pre>
 
-    These properties specifies how the middle part of a sliced rule image is scaled and tiled.
+    These properties specify how the middle part of a sliced rule image is scaled and tiled.
     Values have the following meanings:
 
     <dl dfn-for=column-rule-image-repeat dfn-type=value>
       <dt><dfn>stretch</dfn></dt>
       <dd>The image is stretched to fill the area.
       <dt><dfn>repeat</dfn></dt>
       <dd>The image is tiled (repeated) to fill the area.
       <dt><dfn>round</dfn></dt>
@@ -525,24 +525,24 @@ The 'column-rule-align' and 'row-rule-al
         Percentages: N/A
         Computed value: the specified value
         Animation type: discrete
     </pre>
 
     These properties specify the start/end attachment point of the [=rule containing rectangle=]
     in the [=longitudinal axis=].  The start value is specified first, the end value second.
     If only one value is specified it is used for both start and end.
-    These properties are only used for interior the edges.  The '*-rule-edge-align' properties
-    described below specifies the alignment on the outer edges.  The initial value, ''column-rule-align/gap'',
+    These properties are only used for interior edges.  The '*-rule-edge-align' properties
+    described below specify the alignment on the outer edges.  The initial value, ''column-rule-align/gap'',
     means that, by default, a rule will stretch its longitudinal size to fill the space
     from the end of the gap "above" to the start of the gap "below" ("above" meaning the gap
     in the orthogonal axis on the rule's start side).
 
     <aside class=example>
-        This <a href="examples/grid-align-001.html">example</a> illutrates a few alignment options.
+        This <a href="examples/grid-align-001.html">example</a> illustrates a few alignment options.
         Note that the row rules all have a 1px longitudinal inset
         to separate the individual rule segments. (''column-rule-align/rule-center'',
         for example, would otherwise look like one long rule)
 
         Note also that the column rule is intentionally not centered in
         the gap (to separate the ''row-rule-align/rule-center'' position
         from the ''row-rule-align/gap-center'' position)
         <figure>
@@ -578,17 +578,17 @@ The 'column-rule-edge-align' and 'row-ru
     is used for both start and end.  (Attachment points for the interior rule edges are
     specified with the <a href=#column-rule-align>'*-rule-align'</a> properties above.)
 
     Note: The ''column-rule-align/rule''/''column-rule-align/rule-center''/''column-rule-align/rule-over''
     keywords are omitted here (compared with
     ''column-rule-align'') since there are no rules in the edge gutters.
 
 
-    Thge figure below illustrates the alignment values.
+    The figure below illustrates the alignment values.
     The red values are used for the top column rule's start edge and the yellow
     values are used for its end edge. The yellow values are also used for the bottom
     column rule's start edge. However, in this
     case the roles of ''column-rule-align/gap'' / ''column-rule-align/gap-over'' and
     ''column-rule-align/rule'' / ''column-rule-align/rule-over'' are swapped.  It's only the
     center values that are shared.  Also note that ''column-rule-align/gap-center''
     isn't necessarily aligned with ''column-rule-align/rule-center''. In this case they aren't
     aligned because the row rule (purple) is using a lateral start inset.  The cyan colored
--- a/layout/docs/css-gap-decorations/Overview.html
+++ b/layout/docs/css-gap-decorations/Overview.html
@@ -5,17 +5,16 @@
   <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport">
   <meta content="exploring" name="csswg-work-status">
   <meta content="ED" name="w3c-status">
   <meta content="This is a proposal to extend <a href=&quot;https://drafts.csswg.org/css-align&quot;>CSS Box Alignment</a> to support gap decorations." name="abstract">
   <link href="../default.css" rel="stylesheet" type="text/css">
   <link href="../csslogo.ico" rel="shortcut icon" type="image/x-icon">
   <link href="https://www.w3.org/StyleSheets/TR/2016/W3C-ED" rel="stylesheet" type="text/css">
   <meta content="Bikeshed version d7036035b, updated Fri Oct 8 17:07:11 2021 -0700" name="generator">
-  <meta content="8e27fe76645b992566c8fe35bed8d6a37b0ecdb8" name="document-revision">
 <style>/* style-autolinks */
 
 .css.css, .property.property, .descriptor.descriptor {
     color: var(--a-normal-text);
     font-size: inherit;
     font-family: inherit;
 }
 .css::before, .property::before, .descriptor::before {
@@ -486,32 +485,45 @@ dd:not(:last-child) > .wpt-tests-block:n
 .wpt-tests-block:not([open]):not(:hover){
     opacity: 0.5;
 }
 .wpt-tests-list {
     list-style: none;
     display: grid;
     margin: 0;
     padding: 0;
-    grid-template-columns: 1fr auto auto;
+    grid-template-columns: 1fr max-content auto auto;
     grid-column-gap: .5em;
 }
 .wpt-tests-block hr:last-child {
     display: none;
 }
 .wpt-test {
     display: contents;
 }
 .wpt-test > a {
     text-decoration: underline;
     border: none;
 }
 .wpt-test > .wpt-name { grid-column: 1; }
-.wpt-test > .wpt-live { grid-column: 2; }
-.wpt-test > .wpt-source { grid-column: 3; }
+.wpt-test > .wpt-results { grid-column: 2; }
+.wpt-test > .wpt-live { grid-column: 3; }
+.wpt-test > .wpt-source { grid-column: 4; }
+
+.wpt-test > .wpt-results {
+    display: flex;
+    gap: .1em;
+}
+.wpt-test .wpt-result {
+    display: inline-block;
+    height: 1em;
+    width: 1em;
+    border-radius: 50%;
+    position: relative;
+}
 </style>
 <style>/* style-darkmode */
 
 @media (prefers-color-scheme: dark) {
     :root {
         --text: #ddd;
         --bg: black;
 
@@ -697,17 +709,17 @@ dd:not(:last-child) > .wpt-tests-block:n
     c-[vm] { color: #cb4b16 } /* Name.Variable.Magic */
     c-[il] { color: #657b83 } /* Literal.Number.Integer.Long */
 }
 </style>
  <body class="h-entry">
   <div class="head">
    <p data-fill-with="logo"><a class="logo" href="https://www.w3.org/"> <img alt="W3C" height="48" src="https://www.w3.org/StyleSheets/TR/2016/logos/W3C" width="72"> </a> </p>
    <h1 class="p-name no-ref" id="title">CSS Gap Decorations</h1>
-   <h2 class="no-num no-toc no-ref heading settled" id="profile-and-date"><span class="content">Editor’s Draft, <time class="dt-updated" datetime="2021-10-14">14 October 2021</time></span></h2>
+   <h2 class="no-num no-toc no-ref heading settled" id="profile-and-date"><span class="content">Editor’s Draft, <time class="dt-updated" datetime="2021-10-19">19 October 2021</time></span></h2>
    <details>
     <summary>Specification Metadata</summary>
     <div data-fill-with="spec-metadata">
      <dl>
       <dt>Issue Tracking:
       <dd><a href="https://github.com/w3c/csswg-drafts/labels/css-gap-decorations-1">CSSWG Issues Repository</a>
       <dd><a href="#issues-index">Inline In Spec</a>
       <dt class="editor">Editor:
@@ -888,17 +900,17 @@ on screen, on paper, etc.
       <td>the keyword <span class="css">none</span> or the computed <a class="production css" data-link-type="type" href="https://drafts.csswg.org/css-images-3/#typedef-image" id="ref-for-typedef-image①">&lt;image></a> 
      <tr>
       <th>Canonical order:
       <td>per grammar 
      <tr>
       <th><a href="https://www.w3.org/TR/web-animations/#animation-type">Animation type:</a>
       <td>discrete 
    </table>
-   <p>These properties specifies an <a class="production css" data-link-type="type" href="https://drafts.csswg.org/css-images-3/#typedef-image" id="ref-for-typedef-image②">&lt;image></a> to use in place of the rendering specified
+   <p>These properties specify an <a class="production css" data-link-type="type" href="https://drafts.csswg.org/css-images-3/#typedef-image" id="ref-for-typedef-image②">&lt;image></a> to use in place of the rendering specified
     by the <span class="css">column-rule-style</span>/<span class="css">row-rule-style</span> properties.</p>
    <p>As for borders, a rule image is not rendered when the corresponding <span class="css">column-rule-style</span>/<span class="css">row-rule-style</span> is <span class="css">none</span>.</p>
    <h3 class="heading settled" data-level="2.2" id="column-rule-image-slice"><span class="secno">2.2. </span><span class="content">The <a class="property" data-link-type="propdesc" href="#propdef-column-rule-image-slice" id="ref-for-propdef-column-rule-image-slice">column-rule-image-slice</a> and <a class="property" data-link-type="propdesc" href="#propdef-row-rule-image-slice" id="ref-for-propdef-row-rule-image-slice">row-rule-image-slice</a> Properties</span><a class="self-link" href="#column-rule-image-slice"></a></h3>
    <table class="def propdef" data-link-for-hint="column-rule-image-slice">
     <tbody>
      <tr>
       <th>Name:
       <td><dfn class="dfn-paneled css" data-dfn-type="property" data-export id="propdef-column-rule-image-slice">column-rule-image-slice</dfn>, <dfn class="dfn-paneled css" data-dfn-type="property" data-export id="propdef-row-rule-image-slice">row-rule-image-slice</dfn>
@@ -922,17 +934,17 @@ on screen, on paper, etc.
       <td>one or two values, each either a number or percentage 
      <tr>
       <th>Canonical order:
       <td>per grammar 
      <tr>
       <th><a href="https://www.w3.org/TR/web-animations/#animation-type">Animation type:</a>
       <td>discrete 
    </table>
-   <p>These properties specifies inward offsets from the top and bottom edges of the image,
+   <p>These properties specify inward offsets from the top and bottom edges of the image,
     dividing it into three regions: two edge areas and one middle area.</p>
    <p>When two values are specified, they set the offsets on the top and bottom sides in
     that order. If the bottom is missing, it is the same as the top.</p>
    <dl>
     <dt><dfn class="css" data-dfn-for="column-rule-image-slice" data-dfn-type="value" data-export id="valdef-column-rule-image-slice-percentage-0"><a class="production css" data-link-type="type" href="https://drafts.csswg.org/css-values-4/#percentage-value" id="ref-for-percentage-value②">&lt;percentage [0,∞]></a><a class="self-link" href="#valdef-column-rule-image-slice-percentage-0"></a></dfn> 
     <dd>Percentages are relative to the height of the image. 
     <dt><dfn class="css" data-dfn-for="column-rule-image-slice" data-dfn-type="value" data-export id="valdef-column-rule-image-slice-number-0"><a class="production css" data-link-type="type" href="https://drafts.csswg.org/css-values-4/#number-value" id="ref-for-number-value①">&lt;number [0,∞]></a><a class="self-link" href="#valdef-column-rule-image-slice-number-0"></a></dfn> 
     <dd>Numbers represent pixels in the image (if the image is a raster
@@ -970,17 +982,17 @@ on screen, on paper, etc.
       <td>the specified keyword 
      <tr>
       <th>Canonical order:
       <td>per grammar 
      <tr>
       <th><a href="https://www.w3.org/TR/web-animations/#animation-type">Animation type:</a>
       <td>discrete 
    </table>
-   <p>These properties specifies how the middle part of a sliced rule image is scaled and tiled.
+   <p>These properties specify how the middle part of a sliced rule image is scaled and tiled.
     Values have the following meanings:</p>
    <dl>
     <dt><dfn class="css" data-dfn-for="column-rule-image-repeat" data-dfn-type="value" data-export id="valdef-column-rule-image-repeat-stretch">stretch<a class="self-link" href="#valdef-column-rule-image-repeat-stretch"></a></dfn>
     <dd>The image is stretched to fill the area. 
     <dt><dfn class="css" data-dfn-for="column-rule-image-repeat" data-dfn-type="value" data-export id="valdef-column-rule-image-repeat-repeat">repeat<a class="self-link" href="#valdef-column-rule-image-repeat-repeat"></a></dfn>
     <dd>The image is tiled (repeated) to fill the area. 
     <dt><dfn class="css" data-dfn-for="column-rule-image-repeat" data-dfn-type="value" data-export id="valdef-column-rule-image-repeat-round">round<a class="self-link" href="#valdef-column-rule-image-repeat-round"></a></dfn>
     <dd>The image is tiled (repeated) to fill the area. If it does not
@@ -1023,41 +1035,41 @@ on screen, on paper, etc.
      <tr>
       <th>Canonical order:
       <td>per grammar 
    </table>
    <aside class="example" id="example-c9ee9e2e">
     <a class="self-link" href="#example-c9ee9e2e"></a> This <a href="examples/grid-image-001.html">example</a> demonstrates the new
         rule image properties presented above in a grid layout with spanning elements. 
     <figure>
-      <img height="488" src="media/grid-image-001.png" width="608"> 
+      <img src="media/grid-image-001.png"> 
      <figcaption> Example of image rules. </figcaption>
     </figure>
    </aside>
    <aside class="example" id="example-0518370f">
     <a class="self-link" href="#example-0518370f"></a> Here’s a <a href="examples/grid-image-002.html">variation</a> of the example above
         that animates the container’s size and stretch the middle part of the images. 
     <figure>
      <video autoplay loop src="media/grid-image-002.webm"></video>
      <figcaption> Example of stretching image rules when the container is resized. </figcaption>
     </figure>
    </aside>
    <aside class="example" id="example-746571da">
     <a class="self-link" href="#example-746571da"></a> This is a similar <a href="examples/grid-gradient-001.html">example</a> using gradients. 
     <figure>
-      <img height="489" src="media/grid-gradient-001.png" width="608"> 
+      <img src="media/grid-gradient-001.png"> 
      <figcaption> Example of gradient rules. </figcaption>
     </figure>
    </aside>
    <aside class="example" id="example-4f51bab9">
     <a class="self-link" href="#example-4f51bab9"></a> Here’s an <a href="examples/flexbox-coupon-rule.html">example</a> demonstrating
         support for a use case mentioned in <a href="https://github.com/w3c/csswg-drafts/issues/2748#issuecomment-621983931">issue #2748</a>.
         It’s a coupon with a perforation rendered by a semi-transparent rule image between two flex items. 
     <figure>
-      <img height="108" src="media/flexbox-coupon-rule.png" width="253"> 
+      <img src="media/flexbox-coupon-rule.png"> 
      <figcaption> An example of a semi-transparent column rule image. </figcaption>
     </figure>
    </aside>
    <h2 class="heading settled" data-level="3" id="size"><span class="secno">3. </span><span class="content">Rule Positioning and Sizing</span><a class="self-link" href="#size"></a></h2>
    <p>In this specification, we will use the term <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="lateral-axis">lateral axis</dfn> to refer to
     the axis in which the rule’s thickness grows (i.e. the axis <span class="css">column-rule-width</span> use).  The other axis is the rule’s <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="longitudinal-axis">longitudinal axis</dfn> and
     its size in this axis is the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="rule-length">rule length</dfn>.
     These definitions are relative to the rule itself and does not depend on if
@@ -1213,17 +1225,17 @@ on screen, on paper, etc.
     descriptions below for which of the "edge" or non-"edge" values is used).
     Ditto for the corresponding <span class="css">row-rule-*</span> properties.</p>
    <aside class="example" id="example-a31fa0e2">
     <a class="self-link" href="#example-a31fa0e2"></a> This <a href="examples/grid-lateral-001.html">example</a> demonstrates the rules above.
         Note in particular the latter two grids, which shows what happens when the sum of the
         insets are greater than the <a data-link-type="dfn" href="#rule-containing-rectangle①" id="ref-for-rule-containing-rectangle①⑦">rule containing rectangle’s</a> size.  There’s still
         a zero-sized column rule there, which the row rule (purple) aligns to. 
     <figure>
-      <img height="651" src="media/grid-lateral-001.png" width="997"> 
+      <img src="media/grid-lateral-001.png"> 
      <figcaption> Examples of lateral rule sizing with various inset values. </figcaption>
     </figure>
    </aside>
    <h3 class="heading settled" data-level="3.4" id="column-rule-lateral-inset"><span class="secno">3.4. </span><span class="content">The <a class="property" data-link-type="propdesc" href="#propdef-column-rule-lateral-inset" id="ref-for-propdef-column-rule-lateral-inset">column-rule-lateral-inset</a> and <a class="property" data-link-type="propdesc" href="#propdef-row-rule-lateral-inset" id="ref-for-propdef-row-rule-lateral-inset">row-rule-lateral-inset</a> Shorthands</span><a class="self-link" href="#column-rule-lateral-inset"></a></h3>
    <table class="def propdef" data-link-for-hint="column-rule-lateral-inset">
     <tbody>
      <tr>
       <th>Name:
@@ -1320,17 +1332,17 @@ on screen, on paper, etc.
     and row axis, respectively. They are only used on a rule’s edges that are interior.
     The <a href="#column-rule-longitudinal-edge-inset-start">*-rule-longitudinal-edge-inset</a> properties are used for rule edges that are on the outer edges of an axis.
     The <a data-link-type="dfn" href="https://drafts.csswg.org/css-cascade-5/#used-value" id="ref-for-used-value③">used values</a> are calculated the same as for the lateral properties above.</p>
    <p class="note" role="note"><span>Note:</span> These have a different initial value than the lateral inset properties, meaning the rule will stretch to fill the <a data-link-type="dfn" href="#rule-containing-rectangle①" id="ref-for-rule-containing-rectangle①⑨">rule containing rectangle</a> in this axis.  The initial values as specified above are backward compatible with how column rules are sized and positioned in legacy <a data-link-type="dfn" href="https://drafts.csswg.org/css-multicol-1/#multi-column-layout" id="ref-for-multi-column-layout">multi-column layout</a>.</p>
    <aside class="example" id="example-0ce2b88c">
     <a class="self-link" href="#example-0ce2b88c"></a> Here’s a few simple <a href="examples/grid-longitudinal-001.html">examples</a> of
         the rule sizing and inset properties. 
     <figure>
-      <img height="648" src="media/grid-longitudinal-001.png" width="591"> 
+      <img src="media/grid-longitudinal-001.png"> 
      <figcaption> Examples of rule sizing and inset values. </figcaption>
     </figure>
    </aside>
    <aside class="example" id="example-3020da77">
     <a class="self-link" href="#example-3020da77"></a> This <a href="examples/grid-longitudinal-002.html">example</a> demonstrates
         that the inset properties can be animated and that they are relative the <a data-link-type="dfn" href="#rule-containing-rectangle①" id="ref-for-rule-containing-rectangle①①⓪">rule containing rectangle</a>,
         which itself depends on the <a href="#column-rule-align">rule’s alignment</a> in its longitudinal axis.
         Note that the longitudinal insets in this example are definite and not animated. The reason
@@ -1629,31 +1641,31 @@ on screen, on paper, etc.
       <th>Canonical order:
       <td>per grammar 
      <tr>
       <th><a href="https://www.w3.org/TR/web-animations/#animation-type">Animation type:</a>
       <td>discrete 
    </table>
    <p>These properties specify the start/end attachment point of the <a data-link-type="dfn" href="#rule-containing-rectangle①" id="ref-for-rule-containing-rectangle①①②">rule containing rectangle</a> in the <a data-link-type="dfn" href="#longitudinal-axis" id="ref-for-longitudinal-axis④">longitudinal axis</a>.  The start value is specified first, the end value second.
     If only one value is specified it is used for both start and end.
-    These properties are only used for interior the edges.  The <a class="property" data-link-type="propdesc">*-rule-edge-align</a> properties
-    described below specifies the alignment on the outer edges.  The initial value, <span class="css">gap</span>,
+    These properties are only used for interior edges.  The <a class="property" data-link-type="propdesc">*-rule-edge-align</a> properties
+    described below specify the alignment on the outer edges.  The initial value, <span class="css">gap</span>,
     means that, by default, a rule will stretch its longitudinal size to fill the space
     from the end of the gap "above" to the start of the gap "below" ("above" meaning the gap
     in the orthogonal axis on the rule’s start side).</p>
-   <aside class="example" id="example-07730548">
-    <a class="self-link" href="#example-07730548"></a> This <a href="examples/grid-align-001.html">example</a> illutrates a few alignment options.
+   <aside class="example" id="example-d52ec54e">
+    <a class="self-link" href="#example-d52ec54e"></a> This <a href="examples/grid-align-001.html">example</a> illustrates a few alignment options.
         Note that the row rules all have a 1px longitudinal inset
         to separate the individual rule segments. (<span class="css">rule-center</span>,
         for example, would otherwise look like one long rule) 
     <p>Note also that the column rule is intentionally not centered in
         the gap (to separate the <span class="css">rule-center</span> position
         from the <span class="css">gap-center</span> position)</p>
     <figure>
-      <img height="596" src="media/grid-align-001.png" width="692"> 
+      <img src="media/grid-align-001.png"> 
      <figcaption> Example of <a class="property" data-link-type="propdesc" href="#propdef-row-rule-align" id="ref-for-propdef-row-rule-align①">row-rule-align</a> in a grid container. </figcaption>
     </figure>
     <p>You might be wondering if there’s a bug in the bottom-right example.
         Why is the <span class="css">gap-over</span> not honored there?
         That’s a non-interior rule edge and it’s controlled separately with <span class="css">row-rule-edge-align</span>, see below.</p>
    </aside>
    <h3 class="heading settled" data-level="5.2" id="column-rule-edge-align"><span class="secno">5.2. </span><span class="content">The <a class="property" data-link-type="propdesc" href="#propdef-column-rule-edge-align" id="ref-for-propdef-column-rule-edge-align">column-rule-edge-align</a> and <a class="property" data-link-type="propdesc" href="#propdef-row-rule-edge-align" id="ref-for-propdef-row-rule-edge-align">row-rule-edge-align</a> Properties</span><a class="self-link" href="#column-rule-edge-align"></a></h3>
    <table class="def propdef" data-link-for-hint="column-rule-edge-align">
@@ -1687,30 +1699,30 @@ on screen, on paper, etc.
       <td>discrete 
    </table>
    <p>These properties specify the start/end attachment point of the <a data-link-type="dfn" href="#rule-containing-rectangle①" id="ref-for-rule-containing-rectangle①①③">rule containing rectangle</a> in the <a data-link-type="dfn" href="#longitudinal-axis" id="ref-for-longitudinal-axis⑤">longitudinal axis</a> for the outer edges only. That is, the start edge of the first rule
     and the end edge of the last rule (which may be the same rule).
     The start value is specified first, the end value second.  If only one value is specified it
     is used for both start and end.  (Attachment points for the interior rule edges are
     specified with the <a href="#column-rule-align"><a class="property" data-link-type="propdesc">*-rule-align</a></a> properties above.)</p>
    <p class="note" role="note"><span>Note:</span> The <span class="css">rule</span>/<span class="css">rule-center</span>/<span class="css">rule-over</span> keywords are omitted here (compared with <span class="css">column-rule-align</span>) since there are no rules in the edge gutters.</p>
-   <p>Thge figure below illustrates the alignment values.
+   <p>The figure below illustrates the alignment values.
     The red values are used for the top column rule’s start edge and the yellow
     values are used for its end edge. The yellow values are also used for the bottom
     column rule’s start edge. However, in this
     case the roles of <span class="css">gap</span> / <span class="css">gap-over</span> and <span class="css">rule</span> / <span class="css">rule-over</span> are swapped.  It’s only the
     center values that are shared.  Also note that <span class="css">gap-center</span> isn’t necessarily aligned with <span class="css">rule-center</span>. In this case they aren’t
     aligned because the row rule (purple) is using a lateral start inset.  The cyan colored
     values are used for the bottom column border’s end edge. (If the top border were to
     stretch over the entire grid, then they would be used for its end edge.)</p>
    <p><span class="css">column-rule-edge-align</span> controls which of the red and cyan colored
     attachment points should be used. <span class="css">column-rule-edge-align</span> the yellow colored
     ones (and all other interior edges if there were more rows).</p>
    <figure>
-     <img height="585" src="media/rule-alignment-values.png" width="621"> 
+     <img src="media/rule-alignment-values.png"> 
     <figcaption> Illustration of rule alignment values. </figcaption>
    </figure>
    <p>Here’s the rule styling used for the above example:</p>
 <pre class="language-css highlight">    <c- k>column-rule</c-><c- p>:</c-> <c- m>14</c-><c- k>px</c-> solid blue<c- p>;</c->
     <c- k>column-rule-align</c-><c- p>:</c-> rule-center rule<c- p>;</c->
     <c- k>column-rule-edge-align</c-><c- p>:</c-> gap-center gap-over<c- p>;</c->
 
     <c- k>row-rule</c-><c- p>:</c-> <c- m>16</c-><c- k>px</c-> solid #7000ff<c- p>;</c->
@@ -1770,29 +1782,29 @@ on screen, on paper, etc.
    <p>The following sub-sections will describe the rule extent for each type of layout container in more detail.</p>
    <h4 class="heading settled" data-level="6.1.1" id="rule-extent-grid"><span class="secno">6.1.1. </span><span class="content">Grid Containers</span><a class="self-link" href="#rule-extent-grid"></a></h4>
    <p>In a <a data-link-type="dfn" href="https://drafts.csswg.org/css-grid-2/#grid-container" id="ref-for-grid-container①⑥">grid container</a>, gaps are placed between tracks, so the <span class="css">segment</span> value maps to the extent of a <a data-link-type="dfn" href="https://drafts.csswg.org/css-grid-2/#grid-cell" id="ref-for-grid-cell">grid cell</a>.</p>
    <p>This <a href="examples/grid-segment-001.html">example</a> illustrates <span class="css">segment</span> rules.
     Note that rules are generated in all gaps, whether there are items in a grid cell or not.</p>
    <aside class="example" id="example-9ccc5773">
     <a class="self-link" href="#example-9ccc5773"></a> 
     <figure>
-      <img height="228" src="media/grid-segment-001.png" width="312"> 
+      <img src="media/grid-segment-001.png"> 
      <figcaption> Example of column and row rules with <span class="css">segment</span> extent in a grid container. </figcaption>
     </figure>
    </aside>
    <p><a data-link-type="dfn" href="https://drafts.csswg.org/css-grid-2/#collapsed-track" id="ref-for-collapsed-track">Collapsed tracks</a> don’t count -- they don’t generate gaps and thus don’t have gap rules.
     They generally behave as if they don’t exist as far as rules are concerned.
     The <a href="examples/grid-segment-002.html">example</a> below also
     illustrates that the position and size of the items doesn’t affect the rules, it’s only the size
     of the <a data-link-type="dfn" href="https://drafts.csswg.org/css-grid-2/#grid-cell" id="ref-for-grid-cell①">grid cells</a> that counts.</p>
    <aside class="example" id="example-9818bbbb">
     <a class="self-link" href="#example-9818bbbb"></a> 
     <figure>
-      <img height="228" src="media/grid-segment-002.png" width="608"> 
+      <img src="media/grid-segment-002.png"> 
      <figcaption> Example of column and row rules with in a grid container with <a data-link-type="dfn" href="https://drafts.csswg.org/css-grid-2/#collapsed-track" id="ref-for-collapsed-track①">collapsed tracks</a>. </figcaption>
     </figure>
    </aside>
    <p>Rules behave symmetrically in the grid axes, but a <a data-link-type="dfn" href="https://drafts.csswg.org/css-grid-3/#masonry-axis" id="ref-for-masonry-axis">masonry axis</a> in a <a href="https://drafts.csswg.org/css-grid-3">masonry grid layout</a> behaves
     differently, we’ll cover that case in a separate <a href="#rule-extent-masonry">section</a> later.</p>
    <p>In a grid axis, rules are created between adjacent (non-collapsed) tracks and their <a data-link-type="dfn" href="#extent-size" id="ref-for-extent-size">extent size</a> are controlled by the <span class="css">column-rule-extent</span>/<span class="css">row-rule-extent</span> values as follows:</p>
    <dl>
     <dt><dfn class="css" data-dfn-for="row-rule-extent" data-dfn-type="value" data-export id="valdef-row-rule-extent-segment">segment<a class="self-link" href="#valdef-row-rule-extent-segment"></a></dfn>
@@ -1847,17 +1859,17 @@ on screen, on paper, etc.
    <aside class="example" id="example-a07793b6">
     <a class="self-link" href="#example-a07793b6"></a> This <a href="examples/grid-extent-001.html">example</a> demonstrates the difference between
         the <span class="css">row-rule-extent</span> values in a grid with spanning items.  The grid has seven columns.
         The grid items are semi-transparent to show any rules or overlapping items under them.
         Item 7 for example has <a class="css" data-link-type="propdesc" href="https://drafts.csswg.org/css-grid-2/#propdef-grid-column" id="ref-for-propdef-grid-column">grid-column: 2 / span 3</a> and item 3 has <a class="css" data-link-type="propdesc" href="https://drafts.csswg.org/css-grid-2/#propdef-grid-row" id="ref-for-propdef-grid-row">grid-row: 1 / span 2</a>.
         They are both forced to span into the cell in row 2, column 4 to illustrate what happens
         when items span like this. 
     <figure>
-      <img height="811" src="media/grid-extent-001.png" width="805"> 
+      <img src="media/grid-extent-001.png"> 
      <figcaption> Examples of <span class="css">row-rule-extent</span> in a grid container. </figcaption>
     </figure>
    </aside>
    <h5 class="heading settled" data-level="6.1.1.1" id="rule-extent-subgrid"><span class="secno">6.1.1.1. </span><span class="content">Subgrid</span><a class="self-link" href="#rule-extent-subgrid"></a></h5>
    <p>A subgrid creates its own set of gap rules. It uses its own gaps, which are centered with, but
     may have a different size than the ancestor grid(s), as described in <a href="https://drafts.csswg.org/css-grid/#subgrids">subgrids</a>.
     Other than that, rules are created inside a subgrid in the same way as in a regular grid.</p>
    <p>A grid item that is a subgrid affects its parent grid’s rule formation exactly as
@@ -1874,47 +1886,47 @@ on screen, on paper, etc.
    <aside class="example" id="example-c3d8a4e8">
     <a class="self-link" href="#example-c3d8a4e8"></a> This <a href="examples/grid-subgrid-001.html">example</a> illustrates that
         a subgrid uses its own local gap and rule metrics for positioning and sizing
         its rules. It also shows what happens when a parent rule crosses a subgrid item. 
     <p>Note that the parent’s column rule passing through the subgrid is not used for
         the <a class="css" data-link-type="propdesc" href="#propdef-row-rule-align" id="ref-for-propdef-row-rule-align②">row-rule-align: rule</a> in the subgrid.  The subgrid is in fact completely
         unaware of any parent rules.</p>
     <figure>
-      <img height="256" src="media/grid-subgrid-001.png" width="826"> 
+      <img src="media/grid-subgrid-001.png"> 
      <figcaption> Example of gap rules in a subgrid. </figcaption>
     </figure>
    </aside>
    <h5 class="heading settled" data-level="6.1.1.2" id="rule-extent-masonry"><span class="secno">6.1.1.2. </span><span class="content">Masonry</span><a class="self-link" href="#rule-extent-masonry"></a></h5>
    <p>Masonry layout has one grid axis (which may be <a data-link-type="dfn" href="https://drafts.csswg.org/css-grid-2/#subgrid" id="ref-for-subgrid">subgridded</a>) and one <a data-link-type="dfn" href="https://drafts.csswg.org/css-grid-3/#masonry-axis" id="ref-for-masonry-axis①">masonry axis</a>.
     The grid axis works the same as has been described above.  The masonry axis is special
     since an item is placed into a grid track based on the layout size of the items before
     it, so they are typically not aligned over the tracks.  Furthermore,
     the grid tracks may have a different start position
     (due to <span id="ref-for-masonry-axis②">masonry axis</span> <a href="https://drafts.csswg.org/css-grid-3/#tracks-alignment">alignment</a>)
     and size.</p>
    <aside class="example" id="example-7a037cfa">
     <a class="self-link" href="#example-7a037cfa"></a> This <a href="examples/grid-masonry-001.html">example</a> illustrates a few
         variations of rules in a masonry grid layout. All the grids have <a class="css" data-link-type="propdesc" href="#propdef-column-rule-edge-align" id="ref-for-propdef-column-rule-edge-align①">column-rule-edge-align: gap-over</a> to extend the edge rules out to
         the content-box edge. 
     <figure>
-      <img height="785" src="media/grid-masonry-001.png" width="691"> 
+      <img src="media/grid-masonry-001.png"> 
      <figcaption> Example of gap rules in a masonry grid. </figcaption>
     </figure>
    </aside>
    <aside class="example" id="example-a0ffc13c">
     <a class="self-link" href="#example-a0ffc13c"></a> This <a href="examples/grid-masonry-002.html">example</a> illustrates
         some of the <a class="css" data-link-type="propdesc" href="#propdef-column-rule-extent" id="ref-for-propdef-column-rule-extent①">column-rule-extent: all-*</a> values. 
     <figure>
-      <img height="772" src="media/grid-masonry-002.png" width="730"> 
+      <img src="media/grid-masonry-002.png"> 
      <figcaption> Example of gap rules in a masonry grid. </figcaption>
     </figure>
    </aside>
    <p class="issue" id="issue-b6f1d65c"><a class="self-link" href="#issue-b6f1d65c"></a> TODO: add definition list and algorithm here...</p>
-   <p class="issue" id="issue-3e9abc31"><a class="self-link" href="#issue-3e9abc31"></a> is it useful to be able to create a rule extent for the <i>intersection</i> or <i>union</i> between two tracks, like so: <img height="435" src="media/masonry-all-shorter.png" style="display:block" width="701">It’s pretty easy to implement, fwiw... (I accidently implemented <span class="css">short</span>/<span class="css">long</span> like that before I realized it was inconsistent with how they work elsewhere). I think it’s a case that is unique to a masonry axis though, at least <i>currently</i>...</p>
+   <p class="issue" id="issue-3e9abc31"><a class="self-link" href="#issue-3e9abc31"></a> is it useful to be able to create a rule extent for the <i>intersection</i> or <i>union</i> between two tracks, like so: <img src="media/masonry-all-shorter.png" style="display:block">It’s pretty easy to implement, fwiw... (I accidently implemented <span class="css">short</span>/<span class="css">long</span> like that before I realized it was inconsistent with how they work elsewhere). I think it’s a case that is unique to a masonry axis though, at least <i>currently</i>...</p>
    <h4 class="heading settled" data-level="6.1.2" id="rule-extent-flexbox"><span class="secno">6.1.2. </span><span class="content">Flexbox Containers</span><a class="self-link" href="#rule-extent-flexbox"></a></h4>
    <p>In a <a href="https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-row">row-oriented flexbox container</a>,
     the <span class="css">row-rule-*</span> properties creates rules between flex lines,
     and the <span class="css">column-rule-*</span> properties creates rules between <a href="css-flexbox">flex items</a> within a <a href="cs-flexbox">flex line</a>.</p>
    <p>In <a href="https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-row">column-oriented flexbox container</a>,
     the roles of <span class="css">row-rule-extent</span> and <span class="css">column-rule-extent</span> are swapped. For the rest of this sub-section we
     will describe the row-oriented case (just swap column/row in the text below to get the column-oriented case).</p>
    <p>Flex items can’t span multiple lines so there are no collisions possible for the main axis rules,
@@ -1976,58 +1988,58 @@ on screen, on paper, etc.
            that has an inline start position that is greater than the end position of the picked item 
    </ol>
    <p>(start/end position and sizes above are referring to the item’s margin-box in
      the rule’s longitudinal axis; the phrase "next item" refers to the next item
      in <a data-link-type="dfn" href="https://drafts.csswg.org/css-display-3/#order-modified-document-order" id="ref-for-order-modified-document-order①">order-modified document order</a>)</p>
    <aside class="example" id="example-374fda56">
     <a class="self-link" href="#example-374fda56"></a> Here are a few examples to illustrate the <span class="css">row-rule-extent</span> values. 
     <figure>
-      <img height="194" src="media/flexbox-extent-start-001.png" width="314"> 
+      <img src="media/flexbox-extent-start-001.png"> 
      <figcaption> A <a class="css" data-link-type="propdesc" href="#propdef-row-rule-extent" id="ref-for-propdef-row-rule-extent①">row-rule-extent: start</a> <a href="examples/flexbox-extent-start-001.html">example</a>. </figcaption>
     </figure>
     <figure>
-      <img height="194" src="media/flexbox-extent-end-001.png" width="314"> 
+      <img src="media/flexbox-extent-end-001.png"> 
      <figcaption> A <a class="css" data-link-type="propdesc" href="#propdef-row-rule-extent" id="ref-for-propdef-row-rule-extent②">row-rule-extent: end</a> <a href="examples/flexbox-extent-end-001.html">example</a>. </figcaption>
     </figure>
     <figure>
-      <img height="194" src="media/flexbox-extent-long-001.png" width="314"> 
+      <img src="media/flexbox-extent-long-001.png"> 
      <figcaption> A <a class="css" data-link-type="propdesc" href="#propdef-row-rule-extent" id="ref-for-propdef-row-rule-extent③">row-rule-extent: long</a> <a href="examples/flexbox-extent-long-001.html">example</a>. </figcaption>
     </figure>
     <figure>
-      <img height="194" src="media/flexbox-extent-all-short-001.png" width="314"> 
+      <img src="media/flexbox-extent-all-short-001.png"> 
      <figcaption> A <a class="css" data-link-type="propdesc" href="#propdef-row-rule-extent" id="ref-for-propdef-row-rule-extent④">row-rule-extent: all-short</a> <a href="examples/flexbox-extent-all-short-001.html">example</a>. </figcaption>
     </figure>
     <figure>
-      <img height="194" src="media/flexbox-extent-all-long-001.png" width="314"> 
+      <img src="media/flexbox-extent-all-long-001.png"> 
      <figcaption> A <a class="css" data-link-type="propdesc" href="#propdef-row-rule-extent" id="ref-for-propdef-row-rule-extent⑤">row-rule-extent: all-long</a> <a href="examples/flexbox-extent-all-long-001.html">example</a>. </figcaption>
     </figure>
    </aside>
    <aside class="example" id="example-b631e64a">
     <a class="self-link" href="#example-b631e64a"></a> This is an <a href="examples/flexbox-extent-all-long-allow-overlap-001.html">example</a> to illustrate
         what happens when an <a class="css" data-link-type="propdesc" href="#propdef-column-rule-extent" id="ref-for-propdef-column-rule-extent②">column-rule-extent: all-long allow-overlap</a> rule is
         used and the gaps aren’t aligned.  (The flex items are semi-transparent
         to show the column rules underneath). 
     <figure>
-      <img height="194" src="media/flexbox-extent-all-long-allow-overlap-001.png" width="314"> 
+      <img src="media/flexbox-extent-all-long-allow-overlap-001.png"> 
      <figcaption> A <a class="css" data-link-type="propdesc" href="#propdef-column-rule-extent" id="ref-for-propdef-column-rule-extent③">column-rule-extent: all-long allow-overlap</a> example. </figcaption>
     </figure>
    </aside>
    <h4 class="heading settled" data-level="6.1.3" id="rule-extent-table"><span class="secno">6.1.3. </span><span class="content">Table Containers</span><a class="self-link" href="#rule-extent-table"></a></h4>
    <p>A <a data-link-type="dfn" href="https://drafts.csswg.org/css-tables-3/#table" id="ref-for-table①⑥">table</a> container creates rules between its <a data-link-type="dfn" href="https://drafts.csswg.org/css-tables-3/#table-column-group" id="ref-for-table-column-group">table-column-groups</a> and <a data-link-type="dfn" href="https://drafts.csswg.org/css-tables-3/#table-row-group" id="ref-for-table-row-group①⑥">table-row-groups</a>. <a href="https://drafts.csswg.org/css-tables/#visibility-collapse-rendering">Collapsed</a> column-groups and row-groups are treated as if they don’t exist.
     Column rules (between <span id="ref-for-table-column-group①">table-column-groups</span>) collide with <span id="ref-for-table-row-group①⑦">table-row-groups</span>.
     Row rules (between <span id="ref-for-table-row-group①⑧">table-row-groups</span>) collide with <span id="ref-for-table-column-group②">table-column-groups</span>.
     The <span class="css">allow-overlap</span> can be used to create rules that extend over
     the entire column/row length.  Given that all <span id="ref-for-table-column-group③">table-column-groups</span> have the same block
     axis size and all <span id="ref-for-table-row-group①⑨">table-row-groups</span> have same the inline axis size,
     the <span class="css">short</span>/<span class="css">long</span>/<span class="css">start</span>/<span class="css">end</span> keywords behave the same.  Ditto for the <span class="css">all-*</span> keywords.</p>
    <aside class="example" id="example-5015561d">
     <a class="self-link" href="#example-5015561d"></a> Note, column 2 is collapsed in this example. 
     <figure>
-      <img height="346" src="media/table-rules-001.png" width="818"> 
+      <img src="media/table-rules-001.png"> 
      <figcaption> An <a href="examples/table-rules-001.html">example</a> of table rules. </figcaption>
     </figure>
    </aside>
    <p class="issue" id="issue-96acb267"><a class="self-link" href="#issue-96acb267"></a> sort out if non-collapsed column-groups that only contains collapsed columns should generate rules, ditto row-groups/rows</p>
    <h4 class="heading settled" data-level="6.1.4" id="rule-extent-table-row-group"><span class="secno">6.1.4. </span><span class="content">Table Row Group Containers</span><a class="self-link" href="#rule-extent-table-row-group"></a></h4>
    <p>A <a data-link-type="dfn" href="https://drafts.csswg.org/css-tables-3/#table-row-group" id="ref-for-table-row-group②⓪">table-row-group</a> container creates rules between its <a data-link-type="dfn" href="https://drafts.csswg.org/css-tables-3/#table-row" id="ref-for-table-row">table-rows</a> and between each <a data-link-type="dfn" href="https://drafts.csswg.org/css-tables-3/#table-cell" id="ref-for-table-cell">table-cell</a> in a row.  Collapsed <span id="ref-for-table-row①">table-rows</span> are treated as if they don’t exist.
     Collapsed <a data-link-type="dfn" href="https://drafts.csswg.org/css-tables-3/#table-column" id="ref-for-table-column">table-columns</a> are treated as if they don’t exist.</p>
    <p>Row rules (between <a data-link-type="dfn" href="https://drafts.csswg.org/css-tables-3/#table-row" id="ref-for-table-row②">table-rows</a>) collide with cells that have
@@ -2035,17 +2047,17 @@ on screen, on paper, etc.
     Column rules (between <a data-link-type="dfn" href="https://drafts.csswg.org/css-tables-3/#table-cell" id="ref-for-table-cell①">table-cells</a>) collide with cells that have
     a column <span id="ref-for-span①">span</span> crossing it. <span class="css">allow-overlap</span> can be used to create rules that
     extend over such spanning cells.</p>
    <aside class="example" id="example-2d35e879">
     <a class="self-link" href="#example-2d35e879"></a> This <a href="examples/table-row-group-rules-001.html">example</a> illustrates rules between
         table rows and cells. And also what happens when the table rules from
         the last example is also applied. 
     <figure>
-      <img height="784" src="media/table-row-group-rules-001.png" width="879"> 
+      <img src="media/table-row-group-rules-001.png"> 
      <figcaption> Example of table row and cell rules. </figcaption>
     </figure>
    </aside>
    <p><span class="css">visibility:collapse</span> on <a data-link-type="dfn">table-cells</a> does not affect the rules in any way.</p>
    <h4 class="heading settled" data-level="6.1.5" id="rule-extent-multicol"><span class="secno">6.1.5. </span><span class="content">Multi-Column Containers</span><a class="self-link" href="#rule-extent-multicol"></a></h4>
    <p><a data-link-type="dfn" href="https://drafts.csswg.org/css-multicol-1/#multi-column-container" id="ref-for-multi-column-container①⑥">Multi-column containers</a> already support rendering column rules between its columns.
     That’s now extended with all the new features described above.  The changes described
     above is backward compatible with existing web content that use <i>valid</i> <span class="css">column-rule</span> style values.  Some currently <i>invalid</i> <span class="css">column-rule</span> values are now <i>valid</i> though, which could cause problems.  For example, <a class="css" data-link-type="propdesc" href="https://drafts.csswg.org/css-multicol-1/#propdef-column-rule-width" id="ref-for-propdef-column-rule-width④">column-rule-width: 100%</a>, which
@@ -2053,26 +2065,26 @@ on screen, on paper, etc.
    <p>The <span class="css">row-rule*</span> properties applies to <a data-link-type="dfn" href="https://drafts.csswg.org/css-multicol-1/#multi-column-container" id="ref-for-multi-column-container①⑦">multi-column containers</a> and creates
     row rules between a row of columns in the block axis and <a data-link-type="dfn" href="https://drafts.csswg.org/css-multicol-1/#spanner" id="ref-for-spanner">spanners</a>.</p>
    <p>The <a data-link-type="dfn" href="#segment" id="ref-for-segment">segments</a> are the columns and the <a class="css" data-link-type="maybe" href="https://drafts.csswg.org/css-box-4/#valdef-box-margin-box" id="ref-for-valdef-box-margin-box">margin-box</a> of <a data-link-type="dfn" href="https://drafts.csswg.org/css-multicol-1/#spanner" id="ref-for-spanner①">spanners</a>.</p>
    <p class="issue" id="issue-b4c69802"><a class="self-link" href="#issue-b4c69802"></a> this proposal makes the assumption that the parallel proposal that <span class="css">row-gap</span> should apply to multi-column containers is also adopted (issue #XXX).</p>
    <aside class="example" id="example-b0c3427d">
     <a class="self-link" href="#example-b0c3427d"></a> This <a href="examples/multicol-row-rule-001.html">example</a> illustrates rules in
         a multi-column container. 
     <figure>
-      <img height="854" src="media/multicol-row-rule-001.png" width="827"> 
+      <img src="media/multicol-row-rule-001.png"> 
      <figcaption> Example of column and row rules in a multi-column. </figcaption>
     </figure>
    </aside>
    <aside class="example" id="example-1f836c9e">
     <a class="self-link" href="#example-1f836c9e"></a> If <a data-link-type="dfn" href="https://drafts.csswg.org/css-multicol-1/#multi-column-container" id="ref-for-multi-column-container①⑧">multi-column containers</a> add support for
         'column-span: <a class="production css" data-link-type="type" href="https://drafts.csswg.org/css-values-4/#integer-value" id="ref-for-integer-value">&lt;integer></a>' some time in the future,
         this is how row rules will work: 
     <figure>
-      <img height="195" src="media/multicol-colspan-2.png" width="808"> 
+      <img src="media/multicol-colspan-2.png"> 
      <figcaption> Example of <a class="css" data-link-type="propdesc" href="https://drafts.csswg.org/css-multicol-2/#propdef-column-span" id="ref-for-propdef-column-span">column-span: 2</a> in a multi-column with column and row rules. </figcaption>
     </figure>
    </aside>
    <h2 class="heading settled" data-level="7" id="rule-containing-rectangle"><span class="secno">7. </span><span class="content">The Rule Containing Rectangle</span><a class="self-link" href="#rule-containing-rectangle"></a></h2>
    <p>The <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="rule-containing-rectangle①">rule containing rectangle</dfn> is formed by the <a href="#column-rule-extent">rule extent</a> and <a href="#column-rule-align">alignment</a> in the <a data-link-type="dfn" href="#longitudinal-axis" id="ref-for-longitudinal-axis⑦">longitudinal axis</a>, and by the size of the gap in the <a data-link-type="dfn" href="#lateral-axis" id="ref-for-lateral-axis⑤">lateral axis</a>.
     It is important to note that the <a data-link-type="dfn" href="#rule-containing-rectangle①" id="ref-for-rule-containing-rectangle①①④">rule containing rectangle’s</a> size in an axis isn’t affected by any of
     the <a href="#column-rule-lateral-inset">inset properties</a> <i>in the same axis</i> as that would lead to a circular
     dependency when resolving inset percentage values.  (The <span id="ref-for-rule-containing-rectangle①①⑤">rule containing rectangle</span> is the percentage basis
@@ -2084,17 +2096,17 @@ on screen, on paper, etc.
       <c- k>column-rule-align</c-><c- p>:</c-> rule<c- p>;</c->
       <c- k>column-rule-edge-align</c-><c- p>:</c-> gap-center<c- p>;</c->
       <c- k>column-rule-longitudinal-inset-end</c-><c- p>:</c-> <c- m>8</c-><c- k>px</c-><c- p>;</c->
 
       <c- k>row-rule</c-><c- p>:</c-> <c- m>6</c-><c- k>px</c-> solid black<c- p>;</c->
       <c- k>row-rule-lateral-inset-start</c-><c- p>:</c-> <c- m>20</c-><c- k>px</c-><c- p>;</c->
 </pre>
    <figure>
-     <img height="584" src="media/rule-containing-rectangle.png" width="620"> 
+     <img src="media/rule-containing-rectangle.png"> 
     <figcaption> The Rule Containing Rectangle </figcaption>
    </figure>
    <p>Note that the <a data-link-type="dfn" href="#rule-containing-rectangle①" id="ref-for-rule-containing-rectangle①①⑦">rule containing rectangle</a> extends to the start of the black horizontal rule, which has a <span class="css">20px</span> lateral inset (making it non-centered). We align to its start with <a class="css" data-link-type="propdesc" href="#propdef-column-rule-align" id="ref-for-propdef-column-rule-align②">column-rule-align: rule</a>.  From there,
     we move the bottom edge of the blue rule up by <span class="css">8px</span> with <a class="css" data-link-type="propdesc" href="#propdef-column-rule-longitudinal-inset-end" id="ref-for-propdef-column-rule-longitudinal-inset-end①">column-rule-longitudinal-inset-end: 8px</a>.
     The default <a class="css" data-link-type="propdesc" href="#propdef-column-rule-length" id="ref-for-propdef-column-rule-length①">column-rule-length: auto</a> then fills the resulting area.  If we were to use <span class="css" id="ref-for-propdef-column-rule-length②">column-rule-length: 100%</span> here instead, then the rule would fill the <span id="ref-for-rule-containing-rectangle①①⑧">rule containing rectangle</span> vertically, since that’s its percentage basis. (The end inset would then be ignored since the start inset
     is zero by default so the situation is over-constrained, and we resolve by ignoring the end inset, per the <a href="#rule-sizing">sizing rules</a>.)</p>
    <h2 class="heading settled" data-level="8" id="rule-painting-order"><span class="secno">8. </span><span class="content">Rule Painting Order</span><a class="self-link" href="#rule-painting-order"></a></h2>
    <p>Column and row rules are painted in the same layer as the element’s border.
@@ -2782,17 +2794,17 @@ on screen, on paper, etc.
   <h2 class="no-num no-ref heading settled" id="references"><span class="content">References</span><a class="self-link" href="#references"></a></h2>
   <h3 class="no-num no-ref heading settled" id="normative"><span class="content">Normative References</span><a class="self-link" href="#normative"></a></h3>
   <dl>
    <dt id="biblio-css-backgrounds-3">[CSS-BACKGROUNDS-3]
    <dd>Bert Bos; Elika Etemad; Brad Kemper. <a href="https://www.w3.org/TR/css-backgrounds-3/"><cite>CSS Backgrounds and Borders Module Level 3</cite></a>. 26 July 2021. CR. URL: <a href="https://www.w3.org/TR/css-backgrounds-3/">https://www.w3.org/TR/css-backgrounds-3/</a>
    <dt id="biblio-css-box-4">[CSS-BOX-4]
    <dd>Elika Etemad. <a href="https://www.w3.org/TR/css-box-4/"><cite>CSS Box Model Module Level 4</cite></a>. 21 April 2020. WD. URL: <a href="https://www.w3.org/TR/css-box-4/">https://www.w3.org/TR/css-box-4/</a>
    <dt id="biblio-css-cascade-5">[CSS-CASCADE-5]
-   <dd>Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. <a href="https://www.w3.org/TR/css-cascade-5/"><cite>CSS Cascading and Inheritance Level 5</cite></a>. 29 August 2021. WD. URL: <a href="https://www.w3.org/TR/css-cascade-5/">https://www.w3.org/TR/css-cascade-5/</a>
+   <dd>Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. <a href="https://www.w3.org/TR/css-cascade-5/"><cite>CSS Cascading and Inheritance Level 5</cite></a>. 15 October 2021. WD. URL: <a href="https://www.w3.org/TR/css-cascade-5/">https://www.w3.org/TR/css-cascade-5/</a>
    <dt id="biblio-css-color-4">[CSS-COLOR-4]
    <dd>Tab Atkins Jr.; Chris Lilley. <a href="https://www.w3.org/TR/css-color-4/"><cite>CSS Color Module Level 4</cite></a>. 1 June 2021. WD. URL: <a href="https://www.w3.org/TR/css-color-4/">https://www.w3.org/TR/css-color-4/</a>
    <dt id="biblio-css-display-3">[CSS-DISPLAY-3]
    <dd>Tab Atkins Jr.; Elika Etemad. <a href="https://www.w3.org/TR/css-display-3/"><cite>CSS Display Module Level 3</cite></a>. 3 September 2021. CR. URL: <a href="https://www.w3.org/TR/css-display-3/">https://www.w3.org/TR/css-display-3/</a>
    <dt id="biblio-css-flexbox-1">[CSS-FLEXBOX-1]
    <dd>Tab Atkins Jr.; et al. <a href="https://www.w3.org/TR/css-flexbox-1/"><cite>CSS Flexible Box Layout Module Level 1</cite></a>. 19 November 2018. CR. URL: <a href="https://www.w3.org/TR/css-flexbox-1/">https://www.w3.org/TR/css-flexbox-1/</a>
    <dt id="biblio-css-grid-2">[CSS-GRID-2]
    <dd>Tab Atkins Jr.; Elika Etemad; Rossen Atanassov. <a href="https://www.w3.org/TR/css-grid-2/"><cite>CSS Grid Layout Module Level 2</cite></a>. 18 December 2020. CR. URL: <a href="https://www.w3.org/TR/css-grid-2/">https://www.w3.org/TR/css-grid-2/</a>
@@ -2806,17 +2818,17 @@ on screen, on paper, etc.
    <dd>David Baron; Elika Etemad; Florian Rivoal. <a href="https://www.w3.org/TR/css-overflow-3/"><cite>CSS Overflow Module Level 3</cite></a>. 3 June 2020. WD. URL: <a href="https://www.w3.org/TR/css-overflow-3/">https://www.w3.org/TR/css-overflow-3/</a>
    <dt id="biblio-css-position-3">[CSS-POSITION-3]
    <dd>Elika Etemad; et al. <a href="https://www.w3.org/TR/css-position-3/"><cite>CSS Positioned Layout Module Level 3</cite></a>. 19 May 2020. WD. URL: <a href="https://www.w3.org/TR/css-position-3/">https://www.w3.org/TR/css-position-3/</a>
    <dt id="biblio-css-sizing-3">[CSS-SIZING-3]
    <dd>Tab Atkins Jr.; Elika Etemad. <a href="https://www.w3.org/TR/css-sizing-3/"><cite>CSS Box Sizing Module Level 3</cite></a>. 17 March 2021. WD. URL: <a href="https://www.w3.org/TR/css-sizing-3/">https://www.w3.org/TR/css-sizing-3/</a>
    <dt id="biblio-css-tables-3">[CSS-TABLES-3]
    <dd>François Remy; Greg Whitworth; David Baron. <a href="https://www.w3.org/TR/css-tables-3/"><cite>CSS Table Module Level 3</cite></a>. 27 July 2019. WD. URL: <a href="https://www.w3.org/TR/css-tables-3/">https://www.w3.org/TR/css-tables-3/</a>
    <dt id="biblio-css-values-4">[CSS-VALUES-4]
-   <dd>Tab Atkins Jr.; Elika Etemad. <a href="https://www.w3.org/TR/css-values-4/"><cite>CSS Values and Units Module Level 4</cite></a>. 30 September 2021. WD. URL: <a href="https://www.w3.org/TR/css-values-4/">https://www.w3.org/TR/css-values-4/</a>
+   <dd>Tab Atkins Jr.; Elika Etemad. <a href="https://www.w3.org/TR/css-values-4/"><cite>CSS Values and Units Module Level 4</cite></a>. 16 October 2021. WD. URL: <a href="https://www.w3.org/TR/css-values-4/">https://www.w3.org/TR/css-values-4/</a>
    <dt id="biblio-css-writing-modes-4">[CSS-WRITING-MODES-4]
    <dd>Elika Etemad; Koji Ishii. <a href="https://www.w3.org/TR/css-writing-modes-4/"><cite>CSS Writing Modes Level 4</cite></a>. 30 July 2019. CR. URL: <a href="https://www.w3.org/TR/css-writing-modes-4/">https://www.w3.org/TR/css-writing-modes-4/</a>
    <dt id="biblio-rfc2119">[RFC2119]
    <dd>S. Bradner. <a href="https://datatracker.ietf.org/doc/html/rfc2119"><cite>Key words for use in RFCs to Indicate Requirement Levels</cite></a>. March 1997. Best Current Practice. URL: <a href="https://datatracker.ietf.org/doc/html/rfc2119">https://datatracker.ietf.org/doc/html/rfc2119</a>
   </dl>
   <h3 class="no-num no-ref heading settled" id="informative"><span class="content">Informative References</span><a class="self-link" href="#informative"></a></h3>
   <dl>
    <dt id="biblio-css-multicol-2">[CSS-MULTICOL-2]
@@ -3226,17 +3238,17 @@ on screen, on paper, etc.
     Should we add shorthands for some of those with a <a class="property" data-link-type="propdesc">rule</a> prefix to specify
     both axes, like so: 'rule-foo: <span class="production">&lt;row-rule-foo></span> <span class="production">&lt;column-rule-foo></span>?'.
     As usual, we have to be careful with the separator though, to make it
     forward-compatible with any changes we might want to make... <a class="issue-return" href="#issue-53073ff7" title="Jump to section">↵</a></div>
    <div class="issue"> Are there use cases for other box-related edge attachment points?
     e.g. 'padding | padding-center | padding-over | border...' <a class="issue-return" href="#issue-13842b6f" title="Jump to section">↵</a></div>
    <div class="issue"> perhaps make <a class="css" data-link-type="maybe" href="https://drafts.csswg.org/css-box-4/#valdef-margin-trim-all">all</a> a separate keyword? like so: <span class="css">[segment | [[start | end | short | long] all?] ] allow-overlap?</span> <a class="issue-return" href="#issue-70dc1ba4" title="Jump to section">↵</a></div>
    <div class="issue"> TODO: add definition list and algorithm here... <a class="issue-return" href="#issue-b6f1d65c" title="Jump to section">↵</a></div>
-   <div class="issue"> is it useful to be able to create a rule extent for the <i>intersection</i> or <i>union</i> between two tracks, like so: <img height="435" src="media/masonry-all-shorter.png" style="display:block" width="701">It’s pretty easy to implement, fwiw... (I accidently implemented <span class="css">short</span>/<span class="css">long</span> like that before I realized it was inconsistent with how they work elsewhere). I think it’s a case that is unique to a masonry axis though, at least <i>currently</i>... <a class="issue-return" href="#issue-3e9abc31" title="Jump to section">↵</a></div>
+   <div class="issue"> is it useful to be able to create a rule extent for the <i>intersection</i> or <i>union</i> between two tracks, like so: <img src="media/masonry-all-shorter.png" style="display:block">It’s pretty easy to implement, fwiw... (I accidently implemented <span class="css">short</span>/<span class="css">long</span> like that before I realized it was inconsistent with how they work elsewhere). I think it’s a case that is unique to a masonry axis though, at least <i>currently</i>... <a class="issue-return" href="#issue-3e9abc31" title="Jump to section">↵</a></div>
    <div class="issue"> sort out if non-collapsed column-groups that only contains collapsed columns should generate rules, ditto row-groups/rows <a class="issue-return" href="#issue-96acb267" title="Jump to section">↵</a></div>
    <div class="issue"> this proposal makes the assumption that the parallel proposal that <span class="css">row-gap</span> should apply to multi-column containers is also adopted (issue #XXX). <a class="issue-return" href="#issue-b4c69802" title="Jump to section">↵</a></div>
   </div>
   <aside class="dfn-panel" data-for="propdef-column-rule-image-source">
    <b><a href="#propdef-column-rule-image-source">#propdef-column-rule-image-source</a></b><b>Referenced in:</b>
    <ul>
     <li><a href="#ref-for-propdef-column-rule-image-source">2.1. The column-rule-image-source and row-rule-image-source Properties</a>
     <li><a href="#ref-for-propdef-column-rule-image-source①">2.4. The column-rule-image and row-rule-image Shorthands</a>
@@ -3606,9 +3618,11 @@ document.body.addEventListener("click", 
     } else if(target == "dfn-panel") {
         // Switch it to "activated" state, which pins it.
         el.classList.add("activated");
         el.style.left = null;
         el.style.top = null;
     }
 
 });
+</script>
+<script>/* script-wpt */
 </script>
\ No newline at end of file
--- a/layout/xul/nsMenuPopupFrame.cpp
+++ b/layout/xul/nsMenuPopupFrame.cpp
@@ -269,16 +269,24 @@ void nsMenuPopupFrame::EnsureWidget(bool
   }
   if (!ourView->HasWidget()) {
     NS_ASSERTION(!mGeneratedChildren && !PrincipalChildList().FirstChild(),
                  "Creating widget for MenuPopupFrame with children");
     CreateWidgetForView(ourView);
   }
 }
 
+static Maybe<ColorScheme> GetWidgetColorScheme(const nsMenuPopupFrame* aFrame) {
+  const auto& scheme = aFrame->StyleUI()->mColorScheme.bits;
+  if (!scheme) {
+    return Nothing();
+  }
+  return Some(LookAndFeel::ColorSchemeForFrame(aFrame));
+}
+
 nsresult nsMenuPopupFrame::CreateWidgetForView(nsView* aView) {
   // Create a widget for ourselves.
   nsWidgetInitData widgetData;
   widgetData.mWindowType = eWindowType_popup;
   widgetData.mBorderStyle = eBorderStyle_default;
   widgetData.clipSiblings = true;
   widgetData.mPopupHint = mPopupType;
   widgetData.mNoAutoHide = IsNoAutoHide();
@@ -352,17 +360,17 @@ nsresult nsMenuPopupFrame::CreateWidgetF
     return rv;
   }
 
   nsIWidget* widget = aView->GetWidget();
   widget->SetTransparencyMode(mode);
   widget->SetWindowShadowStyle(GetShadowStyle());
   widget->SetWindowOpacity(StyleUIReset()->mWindowOpacity);
   widget->SetWindowTransform(ComputeWidgetTransform());
-  widget->SetColorScheme(LookAndFeel::ColorSchemeForFrame(this));
+  widget->SetColorScheme(GetWidgetColorScheme(this));
 
   // most popups don't have a title so avoid setting the title if there isn't
   // one
   if (!title.IsEmpty()) {
     widget->SetTitle(title);
   }
 
   return NS_OK;
@@ -502,17 +510,17 @@ void nsMenuPopupFrame::DidSetComputedSty
   if (newUI.mMozWindowTransform != oldUI.mMozWindowTransform) {
     if (nsIWidget* widget = GetWidget()) {
       widget->SetWindowTransform(ComputeWidgetTransform());
     }
   }
 
   if (StyleUI()->mColorScheme != aOldStyle->StyleUI()->mColorScheme) {
     if (nsIWidget* widget = GetWidget()) {
-      widget->SetColorScheme(LookAndFeel::ColorSchemeForFrame(this));
+      widget->SetColorScheme(GetWidgetColorScheme(this));
     }
   }
 
   bool newMouseTransparent = IsMouseTransparent();
   if (newMouseTransparent != IsMouseTransparent(*aOldStyle)) {
     if (nsIWidget* widget = GetWidget()) {
       widget->SetWindowMouseTransparent(newMouseTransparent);
     }
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
@@ -5063,16 +5063,32 @@
   value: true
   mirror: always
 
 - name: gfx.partialpresent.force
   type: RelaxedAtomicInt32
   value: 0
   mirror: always
 
+# SwapInterval
+- name: gfx.swap-interval.glx
+  type: RelaxedAtomicBool
+  value: true
+  mirror: always
+
+- name: gfx.swap-interval.egl
+  type: RelaxedAtomicBool
+  mirror: always
+#ifdef MOZ_WIDGET_ANDROID
+  value: true
+#else
+  value: false
+#endif
+
+
 # Log severe performance warnings to the error console and profiles.
 # This should be use to quickly find which slow paths are used by test cases.
 - name: gfx.perf-warnings.enabled
   type: RelaxedAtomicBool
   value: false
   mirror: always
 
 #ifdef MOZ_X11
@@ -6523,17 +6539,17 @@
 
 - name: layers.iosurfaceimage.recycle-limit
   type: RelaxedAtomicUint32
   value: 15
   mirror: always
 
 - name: layers.iosurfaceimage.use-nv12
   type: bool
-  value: false
+  value: true
   mirror: once
 
 #---------------------------------------------------------------------------
 # Prefs starting with "layout."
 #---------------------------------------------------------------------------
 
 # Debug-only pref to force enable the AccessibleCaret. If you want to
 # control AccessibleCaret by mouse, you'll need to set
@@ -10253,21 +10269,16 @@
   type: RelaxedAtomicBool
   value: true
   mirror: always
 
 #---------------------------------------------------------------------------
 # Prefs starting with "privacy."
 #---------------------------------------------------------------------------
 
-- name: privacy.file_unique_origin
-  type: bool
-  value: true
-  mirror: always
-
 - name: privacy.fuzzyfox.clockgrainus
   type: RelaxedAtomicUint32
   value: 100
   mirror: always
 
 # Annotate trackers using the strict list. If set to false, the basic list will
 # be used instead.
 - name: privacy.annotate_channels.strict_list.enabled
--- a/netwerk/base/BackgroundFileSaver.cpp
+++ b/netwerk/base/BackgroundFileSaver.cpp
@@ -116,18 +116,17 @@ nsresult BackgroundFileSaver::Init() {
 
   return NS_OK;
 }
 
 // Called on the control thread.
 NS_IMETHODIMP
 BackgroundFileSaver::GetObserver(nsIBackgroundFileSaverObserver** aObserver) {
   NS_ENSURE_ARG_POINTER(aObserver);
-  *aObserver = mObserver;
-  NS_IF_ADDREF(*aObserver);
+  *aObserver = do_AddRef(mObserver).take();
   return NS_OK;
 }
 
 // Called on the control thread.
 NS_IMETHODIMP
 BackgroundFileSaver::SetObserver(nsIBackgroundFileSaverObserver* aObserver) {
   mObserver = aObserver;
   return NS_OK;
--- a/netwerk/base/LoadInfo.cpp
+++ b/netwerk/base/LoadInfo.cpp
@@ -810,17 +810,17 @@ already_AddRefed<nsILoadInfo> LoadInfo::
   copy->mRedirectChainIncludingInternalRedirects.Clear();
   copy->mRedirectChain.Clear();
   copy->mResultPrincipalURI = nullptr;
   return copy.forget();
 }
 
 NS_IMETHODIMP
 LoadInfo::GetLoadingPrincipal(nsIPrincipal** aLoadingPrincipal) {
-  NS_IF_ADDREF(*aLoadingPrincipal = mLoadingPrincipal);
+  *aLoadingPrincipal = do_AddRef(mLoadingPrincipal).take();
   return NS_OK;
 }
 
 nsIPrincipal* LoadInfo::VirtualGetLoadingPrincipal() {
   return mLoadingPrincipal;
 }
 
 NS_IMETHODIMP
@@ -828,17 +828,17 @@ LoadInfo::GetTriggeringPrincipal(nsIPrin
   *aTriggeringPrincipal = do_AddRef(mTriggeringPrincipal).take();
   return NS_OK;
 }
 
 nsIPrincipal* LoadInfo::TriggeringPrincipal() { return mTriggeringPrincipal; }
 
 NS_IMETHODIMP
 LoadInfo::GetPrincipalToInherit(nsIPrincipal** aPrincipalToInherit) {
-  NS_IF_ADDREF(*aPrincipalToInherit = mPrincipalToInherit);
+  *aPrincipalToInherit = do_AddRef(mPrincipalToInherit).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 LoadInfo::SetPrincipalToInherit(nsIPrincipal* aPrincipalToInherit) {
   MOZ_ASSERT(aPrincipalToInherit, "must be a valid principal to inherit");
   mPrincipalToInherit = aPrincipalToInherit;
   return NS_OK;
@@ -1747,17 +1747,17 @@ NS_IMETHODIMP
 LoadInfo::GetIsFromObjectOrEmbed(bool* aIsFromObjectOrEmbed) {
   MOZ_ASSERT(aIsFromObjectOrEmbed);
   *aIsFromObjectOrEmbed = mIsFromObjectOrEmbed;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 LoadInfo::GetResultPrincipalURI(nsIURI** aURI) {
-  NS_IF_ADDREF(*aURI = mResultPrincipalURI);
+  *aURI = do_AddRef(mResultPrincipalURI).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 LoadInfo::SetResultPrincipalURI(nsIURI* aURI) {
   mResultPrincipalURI = aURI;
   return NS_OK;
 }
@@ -1888,17 +1888,17 @@ PerformanceStorage* LoadInfo::GetPerform
     return nullptr;
   }
 
   return performance->AsPerformanceStorage();
 }
 
 NS_IMETHODIMP
 LoadInfo::GetCspEventListener(nsICSPEventListener** aCSPEventListener) {
-  NS_IF_ADDREF(*aCSPEventListener = mCSPEventListener);
+  *aCSPEventListener = do_AddRef(mCSPEventListener).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 LoadInfo::SetCspEventListener(nsICSPEventListener* aCSPEventListener) {
   mCSPEventListener = aCSPEventListener;
   return NS_OK;
 }
--- a/netwerk/base/TLSServerSocket.cpp
+++ b/netwerk/base/TLSServerSocket.cpp
@@ -129,18 +129,17 @@ SECStatus TLSServerSocket::AuthCertifica
 // TLSServerSocket::nsITLSServerSocket
 //-----------------------------------------------------------------------------
 
 NS_IMETHODIMP
 TLSServerSocket::GetServerCert(nsIX509Cert** aCert) {
   if (NS_WARN_IF(!aCert)) {
     return NS_ERROR_INVALID_POINTER;
   }
-  *aCert = mServerCert;
-  NS_IF_ADDREF(*aCert);
+  *aCert = do_AddRef(mServerCert).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 TLSServerSocket::SetServerCert(nsIX509Cert* aCert) {
   // If AsyncListen was already called (and set mListener), it's too late to set
   // this.
   if (NS_WARN_IF(mListener)) {
@@ -300,38 +299,35 @@ TLSServerConnectionInfo::SetSecurityObse
   return NS_OK;
 }
 
 NS_IMETHODIMP
 TLSServerConnectionInfo::GetServerSocket(nsITLSServerSocket** aSocket) {
   if (NS_WARN_IF(!aSocket)) {
     return NS_ERROR_INVALID_POINTER;
   }
-  *aSocket = mServerSocket;
-  NS_IF_ADDREF(*aSocket);
+  *aSocket = do_AddRef(mServerSocket).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 TLSServerConnectionInfo::GetStatus(nsITLSClientStatus** aStatus) {
   if (NS_WARN_IF(!aStatus)) {
     return NS_ERROR_INVALID_POINTER;
   }
-  *aStatus = this;
-  NS_IF_ADDREF(*aStatus);
+  *aStatus = do_AddRef(this).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 TLSServerConnectionInfo::GetPeerCert(nsIX509Cert** aCert) {
   if (NS_WARN_IF(!aCert)) {
     return NS_ERROR_INVALID_POINTER;
   }
-  *aCert = mPeerCert;
-  NS_IF_ADDREF(*aCert);
+  *aCert = do_AddRef(mPeerCert).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 TLSServerConnectionInfo::GetTlsVersionUsed(int16_t* aTlsVersionUsed) {
   if (NS_WARN_IF(!aTlsVersionUsed)) {
     return NS_ERROR_INVALID_POINTER;
   }
--- a/netwerk/base/nsDNSPrefetch.cpp
+++ b/netwerk/base/nsDNSPrefetch.cpp
@@ -11,29 +11,27 @@
 #include "nsIDNSListener.h"
 #include "nsIDNSService.h"
 #include "nsIDNSByTypeRecord.h"
 #include "nsICancelable.h"
 #include "nsIURI.h"
 #include "mozilla/Atomics.h"
 #include "mozilla/Preferences.h"
 
-static nsIDNSService* sDNSService = nullptr;
+static mozilla::StaticRefPtr<nsIDNSService> sDNSService;
 
 nsresult nsDNSPrefetch::Initialize(nsIDNSService* aDNSService) {
   MOZ_ASSERT(NS_IsMainThread());
 
-  NS_IF_RELEASE(sDNSService);
   sDNSService = aDNSService;
-  NS_IF_ADDREF(sDNSService);
   return NS_OK;
 }
 
 nsresult nsDNSPrefetch::Shutdown() {
-  NS_IF_RELEASE(sDNSService);
+  sDNSService = nullptr;
   return NS_OK;
 }
 
 nsDNSPrefetch::nsDNSPrefetch(nsIURI* aURI,
                              mozilla::OriginAttributes& aOriginAttributes,
                              nsIRequest::TRRMode aTRRMode,
                              nsIDNSListener* aListener, bool storeTiming)
     : mOriginAttributes(aOriginAttributes),
--- a/netwerk/base/nsIncrementalStreamLoader.cpp
+++ b/netwerk/base/nsIncrementalStreamLoader.cpp
@@ -36,17 +36,17 @@ NS_IMETHODIMP
 nsIncrementalStreamLoader::GetNumBytesRead(uint32_t* aNumBytes) {
   *aNumBytes = mBytesRead;
   return NS_OK;
 }
 
 /* readonly attribute nsIRequest request; */
 NS_IMETHODIMP
 nsIncrementalStreamLoader::GetRequest(nsIRequest** aRequest) {
-  NS_IF_ADDREF(*aRequest = mRequest);
+  *aRequest = do_AddRef(mRequest).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsIncrementalStreamLoader::OnStartRequest(nsIRequest* request) {
   nsCOMPtr<nsIChannel> chan(do_QueryInterface(request));
   if (chan) {
     int64_t contentLength = -1;
--- a/netwerk/base/nsInputStreamChannel.cpp
+++ b/netwerk/base/nsInputStreamChannel.cpp
@@ -50,17 +50,17 @@ NS_IMETHODIMP
 nsInputStreamChannel::SetURI(nsIURI* uri) {
   NS_ENSURE_TRUE(!URI(), NS_ERROR_ALREADY_INITIALIZED);
   nsBaseChannel::SetURI(uri);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsInputStreamChannel::GetContentStream(nsIInputStream** stream) {
-  NS_IF_ADDREF(*stream = mContentStream);
+  *stream = do_AddRef(mContentStream).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsInputStreamChannel::SetContentStream(nsIInputStream* stream) {
   NS_ENSURE_TRUE(!mContentStream, NS_ERROR_ALREADY_INITIALIZED);
   mContentStream = stream;
   return NS_OK;
@@ -82,18 +82,17 @@ nsInputStreamChannel::SetSrcdocData(cons
 NS_IMETHODIMP
 nsInputStreamChannel::GetIsSrcdocChannel(bool* aIsSrcdocChannel) {
   *aIsSrcdocChannel = mIsSrcdocChannel;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsInputStreamChannel::GetBaseURI(nsIURI** aBaseURI) {
-  *aBaseURI = mBaseURI;
-  NS_IF_ADDREF(*aBaseURI);
+  *aBaseURI = do_AddRef(mBaseURI).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsInputStreamChannel::SetBaseURI(nsIURI* aBaseURI) {
   mBaseURI = aBaseURI;
   return NS_OK;
 }
--- a/netwerk/base/nsInputStreamPump.cpp
+++ b/netwerk/base/nsInputStreamPump.cpp
@@ -251,17 +251,17 @@ NS_IMETHODIMP
 nsInputStreamPump::SetTRRMode(nsIRequest::TRRMode aTRRMode) {
   return SetTRRModeImpl(aTRRMode);
 }
 
 NS_IMETHODIMP
 nsInputStreamPump::GetLoadGroup(nsILoadGroup** aLoadGroup) {
   RecursiveMutexAutoLock lock(mMutex);
 
-  NS_IF_ADDREF(*aLoadGroup = mLoadGroup);
+  *aLoadGroup = do_AddRef(mLoadGroup).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsInputStreamPump::SetLoadGroup(nsILoadGroup* aLoadGroup) {
   RecursiveMutexAutoLock lock(mMutex);
 
   mLoadGroup = aLoadGroup;
--- a/netwerk/base/nsMIMEInputStream.cpp
+++ b/netwerk/base/nsMIMEInputStream.cpp
@@ -161,18 +161,17 @@ nsMIMEInputStream::SetData(nsIInputStrea
 
   mStream = aStream;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsMIMEInputStream::GetData(nsIInputStream** aStream) {
   NS_ENSURE_ARG_POINTER(aStream);
-  *aStream = mStream;
-  NS_IF_ADDREF(*aStream);
+  *aStream = do_AddRef(mStream).take();
   return NS_OK;
 }
 
 // set up the internal streams
 void nsMIMEInputStream::InitStreams() {
   NS_ASSERTION(!mStartedReading,
                "Don't call initStreams twice without rewinding");
 
--- a/netwerk/base/nsNetUtil.cpp
+++ b/netwerk/base/nsNetUtil.cpp
@@ -2525,47 +2525,16 @@ bool NS_RelaxStrictFileOriginPolicy(nsIU
 #ifndef MOZ_WIDGET_ANDROID
       NS_FAILED(sourceFile->Normalize()) ||
 #endif
       (!aAllowDirectoryTarget &&
        (NS_FAILED(targetFile->IsDirectory(&targetIsDir)) || targetIsDir))) {
     return false;
   }
 
-  if (!StaticPrefs::privacy_file_unique_origin()) {
-    //
-    // If the file to be loaded is in a subdirectory of the source
-    // (or same-dir if source is not a directory) then it will
-    // inherit its source principal and be scriptable by that source.
-    //
-    bool sourceIsDir;
-    bool allowed = false;
-    nsresult rv = sourceFile->IsDirectory(&sourceIsDir);
-    if (NS_SUCCEEDED(rv) && sourceIsDir) {
-      rv = sourceFile->Contains(targetFile, &allowed);
-    } else {
-      nsCOMPtr<nsIFile> sourceParent;
-      rv = sourceFile->GetParent(getter_AddRefs(sourceParent));
-      if (NS_SUCCEEDED(rv) && sourceParent) {
-        rv = sourceParent->Equals(targetFile, &allowed);
-        if (NS_FAILED(rv) || !allowed) {
-          rv = sourceParent->Contains(targetFile, &allowed);
-        } else {
-          MOZ_ASSERT(aAllowDirectoryTarget,
-                     "sourceFile->Parent == targetFile, but targetFile "
-                     "should've been disallowed if it is a directory");
-        }
-      }
-    }
-
-    if (NS_SUCCEEDED(rv) && allowed) {
-      return true;
-    }
-  }
-
   return false;
 }
 
 bool NS_IsInternalSameURIRedirect(nsIChannel* aOldChannel,
                                   nsIChannel* aNewChannel, uint32_t aFlags) {
   if (!(aFlags & nsIChannelEventSink::REDIRECT_INTERNAL)) {
     return false;
   }
--- a/netwerk/base/nsRedirectHistoryEntry.cpp
+++ b/netwerk/base/nsRedirectHistoryEntry.cpp
@@ -24,20 +24,20 @@ nsRedirectHistoryEntry::nsRedirectHistor
 NS_IMETHODIMP
 nsRedirectHistoryEntry::GetRemoteAddress(nsACString& result) {
   result = mRemoteAddress;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsRedirectHistoryEntry::GetReferrerURI(nsIURI** referrer) {
-  NS_IF_ADDREF(*referrer = mReferrer);
+  *referrer = do_AddRef(mReferrer).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsRedirectHistoryEntry::GetPrincipal(nsIPrincipal** principal) {
-  NS_IF_ADDREF(*principal = mPrincipal);
+  *principal = do_AddRef(mPrincipal).take();
   return NS_OK;
 }
 
 }  // namespace net
 }  // namespace mozilla
--- a/netwerk/base/nsSocketTransport2.cpp
+++ b/netwerk/base/nsSocketTransport2.cpp
@@ -2366,24 +2366,24 @@ nsSocketTransport::Close(nsresult reason
   mInput.CloseWithStatus(reason);
   mOutput.CloseWithStatus(reason);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsSocketTransport::GetSecurityInfo(nsISupports** secinfo) {
   MutexAutoLock lock(mLock);
-  NS_IF_ADDREF(*secinfo = mSecInfo);
+  *secinfo = do_AddRef(mSecInfo).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsSocketTransport::GetSecurityCallbacks(nsIInterfaceRequestor** callbacks) {
   MutexAutoLock lock(mLock);
-  NS_IF_ADDREF(*callbacks = mCallbacks);
+  *callbacks = do_AddRef(mCallbacks).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsSocketTransport::SetSecurityCallbacks(nsIInterfaceRequestor* callbacks) {
   nsCOMPtr<nsIInterfaceRequestor> threadsafeCallbacks;
   NS_NewNotificationCallbacksAggregation(callbacks, nullptr,
                                          GetCurrentEventTarget(),
--- a/netwerk/base/nsUDPSocket.cpp
+++ b/netwerk/base/nsUDPSocket.cpp
@@ -200,17 +200,17 @@ NS_IMETHODIMP
 nsUDPMessage::GetData(nsACString& aData) {
   aData.Assign(reinterpret_cast<const char*>(mData.Elements()), mData.Length());
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsUDPMessage::GetOutputStream(nsIOutputStream** aOutputStream) {
   NS_ENSURE_ARG_POINTER(aOutputStream);
-  NS_IF_ADDREF(*aOutputStream = mOutputStream);
+  *aOutputStream = do_AddRef(mOutputStream).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsUDPMessage::GetRawData(JSContext* cx, JS::MutableHandleValue aRawData) {
   if (!mJsobj) {
     mJsobj =
         dom::Uint8Array::Create(cx, nullptr, mData.Length(), mData.Elements());
@@ -364,17 +364,17 @@ FallibleTArray<uint8_t>& UDPMessageProxy
 NS_IMETHODIMP
 UDPMessageProxy::GetRawData(JSContext* cx, JS::MutableHandleValue aRawData) {
   return NS_ERROR_NOT_IMPLEMENTED;
 }
 
 NS_IMETHODIMP
 UDPMessageProxy::GetOutputStream(nsIOutputStream** aOutputStream) {
   NS_ENSURE_ARG_POINTER(aOutputStream);
-  NS_IF_ADDREF(*aOutputStream = mOutputStream);
+  *aOutputStream = do_AddRef(mOutputStream).take();
   return NS_OK;
 }
 
 }  // anonymous namespace
 
 //-----------------------------------------------------------------------------
 // nsUDPSocket::nsASocketHandler
 //-----------------------------------------------------------------------------
--- a/netwerk/base/nsURLHelper.cpp
+++ b/netwerk/base/nsURLHelper.cpp
@@ -30,54 +30,51 @@
 
 using namespace mozilla;
 
 //----------------------------------------------------------------------------
 // Init/Shutdown
 //----------------------------------------------------------------------------
 
 static bool gInitialized = false;
-static nsIURLParser* gNoAuthURLParser = nullptr;
-static nsIURLParser* gAuthURLParser = nullptr;
-static nsIURLParser* gStdURLParser = nullptr;
+static StaticRefPtr<nsIURLParser> gNoAuthURLParser;
+static StaticRefPtr<nsIURLParser> gAuthURLParser;
+static StaticRefPtr<nsIURLParser> gStdURLParser;
 
 static void InitGlobals() {
   nsCOMPtr<nsIURLParser> parser;
 
   parser = do_GetService(NS_NOAUTHURLPARSER_CONTRACTID);
   NS_ASSERTION(parser, "failed getting 'noauth' url parser");
   if (parser) {
-    gNoAuthURLParser = parser.get();
-    NS_ADDREF(gNoAuthURLParser);
+    gNoAuthURLParser = parser;
   }
 
   parser = do_GetService(NS_AUTHURLPARSER_CONTRACTID);
   NS_ASSERTION(parser, "failed getting 'auth' url parser");
   if (parser) {
-    gAuthURLParser = parser.get();
-    NS_ADDREF(gAuthURLParser);
+    gAuthURLParser = parser;
   }
 
   parser = do_GetService(NS_STDURLPARSER_CONTRACTID);
   NS_ASSERTION(parser, "failed getting 'std' url parser");
   if (parser) {
-    gStdURLParser = parser.get();
-    NS_ADDREF(gStdURLParser);
+    gStdURLParser = parser;
   }
 
   gInitialized = true;
 }
 
 void net_ShutdownURLHelper() {
   if (gInitialized) {
-    NS_IF_RELEASE(gNoAuthURLParser);
-    NS_IF_RELEASE(gAuthURLParser);
-    NS_IF_RELEASE(gStdURLParser);
     gInitialized = false;
   }
+  gNoAuthURLParser = nullptr;
+  gAuthURLParser = nullptr;
+  gStdURLParser = nullptr;
 }
 
 //----------------------------------------------------------------------------
 // nsIURLParser getters
 //----------------------------------------------------------------------------
 
 nsIURLParser* net_GetAuthURLParser() {
   if (!gInitialized) InitGlobals();
--- a/netwerk/cache2/CacheEntry.cpp
+++ b/netwerk/cache2/CacheEntry.cpp
@@ -1320,17 +1320,17 @@ nsresult CacheEntry::OpenOutputStreamInt
   stream.swap(*_retval);
   return NS_OK;
 }
 
 nsresult CacheEntry::GetSecurityInfo(nsISupports** aSecurityInfo) {
   {
     mozilla::MutexAutoLock lock(mLock);
     if (mSecurityInfoLoaded) {
-      NS_IF_ADDREF(*aSecurityInfo = mSecurityInfo);
+      *aSecurityInfo = do_AddRef(mSecurityInfo).take();
       return NS_OK;
     }
   }
 
   NS_ENSURE_SUCCESS(mFileStatus, NS_ERROR_NOT_AVAILABLE);
 
   nsCString info;
   nsCOMPtr<nsISupports> secInfo;
@@ -1345,17 +1345,17 @@ nsresult CacheEntry::GetSecurityInfo(nsI
   }
 
   {
     mozilla::MutexAutoLock lock(mLock);
 
     mSecurityInfo.swap(secInfo);
     mSecurityInfoLoaded = true;
 
-    NS_IF_ADDREF(*aSecurityInfo = mSecurityInfo);
+    *aSecurityInfo = do_AddRef(mSecurityInfo).take();
   }
 
   return NS_OK;
 }
 nsresult CacheEntry::SetSecurityInfo(nsISupports* aSecurityInfo) {
   nsresult rv;
 
   NS_ENSURE_SUCCESS(mFileStatus, mFileStatus);
--- a/netwerk/dns/effective_tld_names.dat
+++ b/netwerk/dns/effective_tld_names.dat
@@ -837,17 +837,23 @@ cu
 com.cu
 edu.cu
 org.cu
 net.cu
 gov.cu
 inf.cu
 
 // cv : https://en.wikipedia.org/wiki/.cv
+// cv : http://www.dns.cv/tldcv_portal/do?com=DS;5446457100;111;+PAGE(4000018)+K-CAT-CODIGO(RDOM)+RCNT(100); <- registration rules
 cv
+com.cv
+edu.cv
+int.cv
+nome.cv
+org.cv
 
 // cw : http://www.una.cw/cw_registry/
 // Confirmed by registry <registry@una.net> 2013-03-26
 cw
 com.cw
 edu.cw
 net.cw
 org.cw
@@ -1174,16 +1180,17 @@ edu.gu
 gov.gu
 guam.gu
 info.gu
 net.gu
 org.gu
 web.gu
 
 // gw : https://en.wikipedia.org/wiki/.gw
+// gw : https://nic.gw/regras/
 gw
 
 // gy : https://en.wikipedia.org/wiki/.gy
 // http://registry.gy/
 gy
 co.gy
 com.gy
 edu.gy
@@ -5848,17 +5855,17 @@ ps
 edu.ps
 gov.ps
 sec.ps
 plo.ps
 com.ps
 org.ps
 net.ps
 
-// pt : http://online.dns.pt/dns/start_dns
+// pt : https://www.dns.pt/en/domain/pt-terms-and-conditions-registration-rules/
 pt
 net.pt
 gov.pt
 org.pt
 edu.pt
 int.pt
 publ.pt
 com.pt
@@ -10786,16 +10793,20 @@ amsw.nl
 // Submitted by Team Amune <cert@amune.org>
 t3l3p0rt.net
 tele.amune.org
 
 // Apigee : https://apigee.com/
 // Submitted by Apigee Security Team <security@apigee.com>
 apigee.io
 
+// Apphud : https://apphud.com
+// Submitted by Alexander Selivanov <alex@apphud.com>
+siiites.com
+
 // Appspace : https://www.appspace.com
 // Submitted by Appspace Security Team <security@appspace.com>
 appspacehosted.com
 appspaceusercontent.com
 
 // Appudo UG (haftungsbeschränkt) : https://www.appudo.com
 // Submitted by Alexander Hochbaum <admin@appudo.com>
 appudo.net
@@ -11660,20 +11671,16 @@ en-root.fr
 mytuleap.com
 tuleap-partners.com
 
 // ECG Robotics, Inc: https://ecgrobotics.org
 // Submitted by <frc1533@ecgrobotics.org>
 onred.one
 staging.onred.one
 
-// One.com: https://www.one.com/
-// Submitted by Jacob Bunk Nielsen <jbn@one.com>
-service.one
-
 // EU.org https://eu.org/
 // Submitted by Pierre Beyssac <hostmaster@eu.org>
 eu.org
 al.eu.org
 asso.eu.org
 at.eu.org
 au.eu.org
 be.eu.org
@@ -12907,16 +12914,20 @@ omg.lol
 // Omnibond Systems, LLC. : https://www.omnibond.com
 // Submitted by Cole Estep <cole@omnibond.com>
 cloudycluster.net
 
 // OmniWe Limited: https://omniwe.com
 // Submitted by Vicary Archangel <vicary@omniwe.com>
 omniwe.site
 
+// One.com: https://www.one.com/
+// Submitted by Jacob Bunk Nielsen <jbn@one.com>
+service.one
+
 // One Fold Media : http://www.onefoldmedia.com/
 // Submitted by Eddie Jones <eddie@onefoldmedia.com>
 nid.io
 
 // Open Social : https://www.getopensocial.com/
 // Submitted by Alexander Varwijk <security@getopensocial.com>
 opensocial.site
 
@@ -13461,16 +13472,21 @@ direct.quickconnect.to
 // Tabit Technologies Ltd. : https://tabit.cloud/
 // Submitted by Oren Agiv <oren@tabit.cloud>
 tabitorder.co.il
 
 // TAIFUN Software AG : http://taifun-software.de
 // Submitted by Bjoern Henke <dev-server@taifun-software.de>
 taifun-dns.de
 
+// Tailscale Inc. : https://www.tailscale.com
+// Submitted by David Anderson <danderson@tailscale.com>
+beta.tailscale.net
+ts.net
+
 // TASK geographical domains (www.task.gda.pl/uslugi/dns)
 gda.pl
 gdansk.pl
 gdynia.pl
 med.pl
 sopot.pl
 
 // Teckids e.V. : https://www.teckids.org
--- a/netwerk/ipc/DocumentLoadListener.cpp
+++ b/netwerk/ipc/DocumentLoadListener.cpp
@@ -1462,16 +1462,31 @@ void DocumentLoadListener::SerializeRedi
   aArgs.loadStateInternalLoadFlags() = mLoadStateInternalLoadFlags;
   aArgs.loadStateLoadType() = mLoadStateLoadType;
   aArgs.originalUriString() = mOriginalUriString;
   if (mLoadingSessionHistoryInfo) {
     aArgs.loadingSessionHistoryInfo().emplace(*mLoadingSessionHistoryInfo);
   }
 }
 
+DocumentLoadListener::ProcessBehavior GetProcessSwitchBehavior(
+    Element* aBrowserElement) {
+  if (aBrowserElement->HasAttribute(u"maychangeremoteness"_ns)) {
+    return DocumentLoadListener::ProcessBehavior::PROCESS_BEHAVIOR_STANDARD;
+  }
+  nsCOMPtr<nsIBrowser> browser = aBrowserElement->AsBrowser();
+  bool isRemoteBrowser = false;
+  browser->GetIsRemoteBrowser(&isRemoteBrowser);
+  if (isRemoteBrowser) {
+    return DocumentLoadListener::ProcessBehavior::
+        PROCESS_BEHAVIOR_SUBFRAME_ONLY;
+  }
+  return DocumentLoadListener::ProcessBehavior::PROCESS_BEHAVIOR_DISABLED;
+}
+
 static bool ContextCanProcessSwitch(CanonicalBrowsingContext* aBrowsingContext,
                                     WindowGlobalParent* aParentWindow) {
   if (NS_WARN_IF(!aBrowsingContext)) {
     MOZ_LOG(gProcessIsolationLog, LogLevel::Warning,
             ("Process Switch Abort: no browsing context"));
     return false;
   }
   if (!aBrowsingContext->IsContent()) {
@@ -1502,36 +1517,30 @@ static bool ContextCanProcessSwitch(Cano
   }
   nsCOMPtr<nsIBrowser> browser = browserElement->AsBrowser();
   if (!browser) {
     MOZ_LOG(gProcessIsolationLog, LogLevel::Warning,
             ("Process Switch Abort: not loaded within nsIBrowser"));
     return false;
   }
 
-  nsIBrowser::ProcessBehavior processBehavior =
-      nsIBrowser::PROCESS_BEHAVIOR_DISABLED;
-  nsresult rv = browser->GetProcessSwitchBehavior(&processBehavior);
-  if (NS_FAILED(rv)) {
-    MOZ_ASSERT_UNREACHABLE(
-        "nsIBrowser::GetProcessSwitchBehavior shouldn't fail");
-    MOZ_LOG(gProcessIsolationLog, LogLevel::Warning,
-            ("Process Switch Abort: failed to get process switch behavior"));
-    return false;
-  }
+  DocumentLoadListener::ProcessBehavior processBehavior =
+      GetProcessSwitchBehavior(browserElement);
 
   // Check if the process switch we're considering is disabled by the
   // <browser>'s process behavior.
-  if (processBehavior == nsIBrowser::PROCESS_BEHAVIOR_DISABLED) {
+  if (processBehavior ==
+      DocumentLoadListener::ProcessBehavior::PROCESS_BEHAVIOR_DISABLED) {
     MOZ_LOG(gProcessIsolationLog, LogLevel::Warning,
             ("Process Switch Abort: switch disabled by <browser>"));
     return false;
   }
-  if (!aParentWindow &&
-      processBehavior == nsIBrowser::PROCESS_BEHAVIOR_SUBFRAME_ONLY) {
+  if (!aParentWindow && processBehavior ==
+                            DocumentLoadListener::ProcessBehavior::
+                                PROCESS_BEHAVIOR_SUBFRAME_ONLY) {
     MOZ_LOG(gProcessIsolationLog, LogLevel::Warning,
             ("Process Switch Abort: toplevel switch disabled by <browser>"));
     return false;
   }
 
   return true;
 }
 
--- a/netwerk/ipc/DocumentLoadListener.h
+++ b/netwerk/ipc/DocumentLoadListener.h
@@ -284,16 +284,35 @@ class DocumentLoadListener : public nsII
   uint32_t GetLoadType() const { return mLoadStateLoadType; }
 
   mozilla::dom::LoadingSessionHistoryInfo* GetLoadingSessionHistoryInfo() {
     return mLoadingSessionHistoryInfo.get();
   }
 
   bool IsDocumentLoad() const { return mIsDocumentLoad; }
 
+  // Determine what process switching behavior a browser element should have.
+  enum ProcessBehavior : uint8_t {
+    // Gecko won't automatically change which process this frame, or it's
+    // subframes, are loaded in.
+    PROCESS_BEHAVIOR_DISABLED,
+
+    // If `useRemoteTabs` is enabled, Gecko will change which process this frame
+    // is loaded in automatically, without calling `performProcessSwitch`.
+    // When `useRemoteSubframes` is enabled, subframes will change processes.
+    PROCESS_BEHAVIOR_STANDARD,
+
+    // Gecko won't automatically change which process this frame is loaded, but
+    // when `useRemoteSubframes` is enabled, subframes will change processes.
+    //
+    // NOTE: This configuration is included only for backwards compatibility,
+    // and will be removed, as it can easily lead to invalid behavior.
+    PROCESS_BEHAVIOR_SUBFRAME_ONLY,
+  };
+
  protected:
   virtual ~DocumentLoadListener();
 
  private:
   RefPtr<OpenPromise> OpenInParent(nsDocShellLoadState* aLoadState,
                                    bool aSupportsRedirectToRealChannel);
 
   friend class ParentProcessDocumentOpenInfo;
--- a/netwerk/protocol/file/nsFileChannel.cpp
+++ b/netwerk/protocol/file/nsFileChannel.cpp
@@ -508,11 +508,11 @@ nsFileChannel::SetUploadStream(nsIInputS
   } else {
     mUploadLength = -1;
   }
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsFileChannel::GetUploadStream(nsIInputStream** result) {
-  NS_IF_ADDREF(*result = mUploadStream);
+  *result = do_AddRef(mUploadStream).take();
   return NS_OK;
 }
--- a/netwerk/protocol/gio/nsGIOProtocolHandler.cpp
+++ b/netwerk/protocol/gio/nsGIOProtocolHandler.cpp
@@ -159,69 +159,58 @@ static void mount_operation_ask_password
     GMountOperation* mount_op, const char* message, const char* default_user,
     const char* default_domain, GAskPasswordFlags flags, gpointer user_data);
 //-----------------------------------------------------------------------------
 class nsGIOInputStream final : public nsIInputStream {
  public:
   NS_DECL_THREADSAFE_ISUPPORTS
   NS_DECL_NSIINPUTSTREAM
 
-  explicit nsGIOInputStream(const nsCString& uriSpec)
-      : mSpec(uriSpec),
-        mChannel(nullptr),
-        mHandle(nullptr),
-        mStream(nullptr),
-        mBytesRemaining(UINT64_MAX),
-        mStatus(NS_OK),
-        mDirList(nullptr),
-        mDirListPtr(nullptr),
-        mDirBufCursor(0),
-        mDirOpen(false),
-        mMonitorMountInProgress("GIOInputStream::MountFinished") {}
+  explicit nsGIOInputStream(const nsCString& uriSpec) : mSpec(uriSpec) {}
 
   void SetChannel(nsIChannel* channel) {
     // We need to hold an owning reference to our channel.  This is done
     // so we can access the channel's notification callbacks to acquire
     // a reference to a nsIAuthPrompt if we need to handle an interactive
     // mount operation.
     //
     // However, the channel can only be accessed on the main thread, so
     // we have to be very careful with ownership.  Moreover, it doesn't
     // support threadsafe addref/release, so proxying is the answer.
     //
     // Also, it's important to note that this likely creates a reference
     // cycle since the channel likely owns this stream.  This reference
     // cycle is broken in our Close method.
 
-    NS_ADDREF(mChannel = channel);
+    mChannel = do_AddRef(channel).take();
   }
   void SetMountResult(MountOperationResult result, gint error_code);
 
  private:
   ~nsGIOInputStream() { Close(); }
   nsresult DoOpen();
   nsresult DoRead(char* aBuf, uint32_t aCount, uint32_t* aCountRead);
   nsresult SetContentTypeOfChannel(const char* contentType);
   nsresult MountVolume();
   nsresult DoOpenDirectory();
   nsresult DoOpenFile(GFileInfo* info);
   nsCString mSpec;
-  nsIChannel* mChannel;  // manually refcounted
-  GFile* mHandle;
-  GFileInputStream* mStream;
-  uint64_t mBytesRemaining;
-  nsresult mStatus;
-  GList* mDirList;
-  GList* mDirListPtr;
+  nsIChannel* mChannel{nullptr};  // manually refcounted
+  GFile* mHandle{nullptr};
+  GFileInputStream* mStream{nullptr};
+  uint64_t mBytesRemaining{UINT64_MAX};
+  nsresult mStatus{NS_OK};
+  GList* mDirList{nullptr};
+  GList* mDirListPtr{nullptr};
   nsCString mDirBuf;
-  uint32_t mDirBufCursor;
-  bool mDirOpen;
+  uint32_t mDirBufCursor{0};
+  bool mDirOpen{false};
   MountOperationResult mMountRes =
       MountOperationResult::MOUNT_OPERATION_SUCCESS;
-  mozilla::Monitor mMonitorMountInProgress;
+  mozilla::Monitor mMonitorMountInProgress{"GIOInputStream::MountFinished"};
   gint mMountErrorCode{};
 };
 
 /**
  * Set result of mount operation and notify monitor waiting for results.
  * This method is called in main thread as long as it is used only
  * in mount_enclosing_volume_finished function.
  * @param result Result of mount operation
--- a/netwerk/protocol/http/ClassifierDummyChannel.cpp
+++ b/netwerk/protocol/http/ClassifierDummyChannel.cpp
@@ -91,50 +91,44 @@ ClassifierDummyChannel::ClassifierDummyC
       mFirstPartyClassificationFlags(0),
       mThirdPartyClassificationFlags(0) {
   MOZ_ASSERT(XRE_IsParentProcess());
 
   SetOriginalURI(aURI);
   SetLoadInfo(aLoadInfo);
 }
 
-ClassifierDummyChannel::~ClassifierDummyChannel() {
-  NS_ReleaseOnMainThread("ClassifierDummyChannel::mURI", mURI.forget());
-  NS_ReleaseOnMainThread("ClassifierDummyChannel::mTopWindowURI",
-                         mTopWindowURI.forget());
-}
-
 void ClassifierDummyChannel::AddClassificationFlags(
     uint32_t aClassificationFlags, bool aThirdParty) {
   if (aThirdParty) {
     mThirdPartyClassificationFlags |= aClassificationFlags;
   } else {
     mFirstPartyClassificationFlags |= aClassificationFlags;
   }
 }
 
 //-----------------------------------------------------------------------------
 // ClassifierDummyChannel::nsIChannel
 //-----------------------------------------------------------------------------
 
 NS_IMETHODIMP
 ClassifierDummyChannel::GetOriginalURI(nsIURI** aOriginalURI) {
-  NS_IF_ADDREF(*aOriginalURI = mURI);
+  *aOriginalURI = do_AddRef(mURI).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 ClassifierDummyChannel::SetOriginalURI(nsIURI* aOriginalURI) {
   mURI = aOriginalURI;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 ClassifierDummyChannel::GetURI(nsIURI** aURI) {
-  NS_IF_ADDREF(*aURI = mURI);
+  *aURI = do_AddRef(mURI).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 ClassifierDummyChannel::GetOwner(nsISupports** aOwner) {
   return NS_ERROR_NOT_IMPLEMENTED;
 }
 
@@ -234,17 +228,17 @@ ClassifierDummyChannel::SetContentDispos
 NS_IMETHODIMP
 ClassifierDummyChannel::GetContentDispositionHeader(
     nsACString& aContentDispositionHeader) {
   return NS_ERROR_NOT_IMPLEMENTED;
 }
 
 NS_IMETHODIMP
 ClassifierDummyChannel::GetLoadInfo(nsILoadInfo** aLoadInfo) {
-  NS_IF_ADDREF(*aLoadInfo = mLoadInfo);
+  *aLoadInfo = do_AddRef(mLoadInfo).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 ClassifierDummyChannel::SetLoadInfo(nsILoadInfo* aLoadInfo) {
   MOZ_RELEASE_ASSERT(aLoadInfo, "loadinfo can't be null");
   mLoadInfo = aLoadInfo;
   return NS_OK;
--- a/netwerk/protocol/http/ClassifierDummyChannel.h
+++ b/netwerk/protocol/http/ClassifierDummyChannel.h
@@ -66,17 +66,17 @@ class ClassifierDummyChannel final : pub
       nsIChannel* aChannel, const std::function<void(bool)>& aCallback);
 
   ClassifierDummyChannel(nsIURI* aURI, nsIURI* aTopWindowURI,
                          nsresult aTopWindowURIResult, nsILoadInfo* aLoadInfo);
 
   void AddClassificationFlags(uint32_t aClassificationFlags, bool aThirdParty);
 
  private:
-  ~ClassifierDummyChannel();
+  ~ClassifierDummyChannel() = default;
 
   nsCOMPtr<nsILoadInfo> mLoadInfo;
   nsCOMPtr<nsIURI> mURI;
   nsCOMPtr<nsIURI> mTopWindowURI;
   nsresult mTopWindowURIResult;
 
   uint32_t mFirstPartyClassificationFlags;
   uint32_t mThirdPartyClassificationFlags;
--- a/netwerk/protocol/http/HttpBaseChannel.cpp
+++ b/netwerk/protocol/http/HttpBaseChannel.cpp
@@ -429,18 +429,17 @@ HttpBaseChannel::GetStatus(nsresult* aSt
   NS_ENSURE_ARG_POINTER(aStatus);
   *aStatus = mStatus;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::GetLoadGroup(nsILoadGroup** aLoadGroup) {
   NS_ENSURE_ARG_POINTER(aLoadGroup);
-  *aLoadGroup = mLoadGroup;
-  NS_IF_ADDREF(*aLoadGroup);
+  *aLoadGroup = do_AddRef(mLoadGroup).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::SetLoadGroup(nsILoadGroup* aLoadGroup) {
   MOZ_ASSERT(NS_IsMainThread(), "Should only be called on the main thread.");
 
   if (!CanSetLoadGroup(aLoadGroup)) {
@@ -537,18 +536,17 @@ HttpBaseChannel::GetURI(nsIURI** aURI) {
   NS_ENSURE_ARG_POINTER(aURI);
   *aURI = do_AddRef(mURI).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::GetOwner(nsISupports** aOwner) {
   NS_ENSURE_ARG_POINTER(aOwner);
-  *aOwner = mOwner;
-  NS_IF_ADDREF(*aOwner);
+  *aOwner = do_AddRef(mOwner).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::SetOwner(nsISupports* aOwner) {
   mOwner = aOwner;
   return NS_OK;
 }
@@ -557,29 +555,28 @@ NS_IMETHODIMP
 HttpBaseChannel::SetLoadInfo(nsILoadInfo* aLoadInfo) {
   MOZ_RELEASE_ASSERT(aLoadInfo, "loadinfo can't be null");
   mLoadInfo = aLoadInfo;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::GetLoadInfo(nsILoadInfo** aLoadInfo) {
-  NS_IF_ADDREF(*aLoadInfo = mLoadInfo);
+  *aLoadInfo = do_AddRef(mLoadInfo).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::GetIsDocument(bool* aIsDocument) {
   return NS_GetIsDocumentChannel(this, aIsDocument);
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::GetNotificationCallbacks(nsIInterfaceRequestor** aCallbacks) {
-  *aCallbacks = mCallbacks;
-  NS_IF_ADDREF(*aCallbacks);
+  *aCallbacks = do_AddRef(mCallbacks).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::SetNotificationCallbacks(nsIInterfaceRequestor* aCallbacks) {
   MOZ_ASSERT(NS_IsMainThread(), "Should only be called on the main thread.");
 
   if (!CanSetCallbacks(aCallbacks)) {
@@ -792,18 +789,17 @@ HttpBaseChannel::Open(nsIInputStream** a
 
 //-----------------------------------------------------------------------------
 // HttpBaseChannel::nsIUploadChannel
 //-----------------------------------------------------------------------------
 
 NS_IMETHODIMP
 HttpBaseChannel::GetUploadStream(nsIInputStream** stream) {
   NS_ENSURE_ARG_POINTER(stream);
-  *stream = mUploadStream;
-  NS_IF_ADDREF(*stream);
+  *stream = do_AddRef(mUploadStream).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::SetUploadStream(nsIInputStream* stream,
                                  const nsACString& contentTypeArg,
                                  int64_t contentLength) {
   // NOTE: for backwards compatibility and for compatibility with old style
@@ -1275,18 +1271,17 @@ HttpBaseChannel::DoApplyContentConversio
         }
         Telemetry::Accumulate(Telemetry::HTTP_CONTENT_ENCODING, mode);
       }
       nextListener = converter;
     } else {
       if (val) LOG(("Unknown content encoding '%s', ignoring\n", val));
     }
   }
-  *aNewNextListener = nextListener;
-  NS_IF_ADDREF(*aNewNextListener);
+  *aNewNextListener = do_AddRef(nextListener).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::GetContentEncodings(nsIUTF8StringEnumerator** aEncodings) {
   if (!mResponseHead) {
     *aEncodings = nullptr;
     return NS_OK;
@@ -2119,25 +2114,24 @@ nsresult HttpBaseChannel::GetTopWindowUR
         if (NS_SUCCEEDED(mTopWindowURI->GetSpec(spec))) {
           LOG(("HttpChannelBase::Setting topwindow URI spec %s [this=%p]\n",
                spec.get(), this));
         }
       }
 #endif
     }
   }
-  NS_IF_ADDREF(*aTopWindowURI = mTopWindowURI);
+  *aTopWindowURI = do_AddRef(mTopWindowURI).take();
   return rv;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::GetDocumentURI(nsIURI** aDocumentURI) {
   NS_ENSURE_ARG_POINTER(aDocumentURI);
-  *aDocumentURI = mDocumentURI;
-  NS_IF_ADDREF(*aDocumentURI);
+  *aDocumentURI = do_AddRef(mDocumentURI).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::SetDocumentURI(nsIURI* aDocumentURI) {
   ENSURE_CALLED_BEFORE_CONNECT();
 
   mDocumentURI = aDocumentURI;
@@ -3409,17 +3403,17 @@ NS_IMETHODIMP
 HttpBaseChannel::SetTlsFlags(uint32_t aTlsFlags) {
   mTlsFlags = aTlsFlags;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::GetApiRedirectToURI(nsIURI** aResult) {
   NS_ENSURE_ARG_POINTER(aResult);
-  NS_IF_ADDREF(*aResult = mAPIRedirectToURI);
+  *aResult = do_AddRef(mAPIRedirectToURI).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpBaseChannel::GetResponseTimeoutEnabled(bool* aEnable) {
   if (NS_WARN_IF(!aEnable)) {
     return NS_ERROR_NULL_POINTER;
   }
--- a/netwerk/protocol/http/HttpChannelChild.cpp
+++ b/netwerk/protocol/http/HttpChannelChild.cpp
@@ -1881,17 +1881,17 @@ HttpChannelChild::Resume() {
 
 //-----------------------------------------------------------------------------
 // HttpChannelChild::nsIChannel
 //-----------------------------------------------------------------------------
 
 NS_IMETHODIMP
 HttpChannelChild::GetSecurityInfo(nsISupports** aSecurityInfo) {
   NS_ENSURE_ARG_POINTER(aSecurityInfo);
-  NS_IF_ADDREF(*aSecurityInfo = mSecurityInfo);
+  *aSecurityInfo = do_AddRef(mSecurityInfo).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HttpChannelChild::AsyncOpen(nsIStreamListener* aListener) {
   LOG(("HttpChannelChild::AsyncOpen [this=%p uri=%s]\n", this, mSpec.get()));
 
   nsresult rv = AsyncOpenInternal(aListener);
--- a/netwerk/protocol/http/HttpConnectionBase.h
+++ b/netwerk/protocol/http/HttpConnectionBase.h
@@ -100,17 +100,17 @@ class HttpConnectionBase : public nsSupp
   // authenticated using a client certificate.  Before SSL negotiation
   // has finished this returns false.
   virtual bool NoClientCertAuth() const { return true; }
 
   // HTTP/2 websocket support
   virtual bool CanAcceptWebsocket() { return false; }
 
   void GetConnectionInfo(nsHttpConnectionInfo** ci) {
-    NS_IF_ADDREF(*ci = mConnInfo);
+    *ci = do_AddRef(mConnInfo).take();
   }
   virtual void GetSecurityInfo(nsISupports** result) = 0;
 
   [[nodiscard]] virtual nsresult ResumeSend() = 0;
   [[nodiscard]] virtual nsresult ResumeRecv() = 0;
   [[nodiscard]] virtual nsresult ForceSend() = 0;
   [[nodiscard]] virtual nsresult ForceRecv() = 0;
   virtual HttpVersion Version() = 0;
--- a/netwerk/protocol/http/NullHttpChannel.cpp
+++ b/netwerk/protocol/http/NullHttpChannel.cpp
@@ -287,29 +287,29 @@ NullHttpChannel::GetEncodedBodySize(uint
 }
 
 //-----------------------------------------------------------------------------
 // NullHttpChannel::nsIChannel
 //-----------------------------------------------------------------------------
 
 NS_IMETHODIMP
 NullHttpChannel::GetOriginalURI(nsIURI** aOriginalURI) {
-  NS_IF_ADDREF(*aOriginalURI = mOriginalURI);
+  *aOriginalURI = do_AddRef(mOriginalURI).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 NullHttpChannel::SetOriginalURI(nsIURI* aOriginalURI) {
   mOriginalURI = aOriginalURI;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 NullHttpChannel::GetURI(nsIURI** aURI) {
-  NS_IF_ADDREF(*aURI = mURI);
+  *aURI = do_AddRef(mURI).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 NullHttpChannel::GetOwner(nsISupports** aOwner) {
   return NS_ERROR_NOT_IMPLEMENTED;
 }
 
--- a/netwerk/protocol/http/TRRServiceChannel.cpp
+++ b/netwerk/protocol/http/TRRServiceChannel.cpp
@@ -157,18 +157,17 @@ TRRServiceChannel::Resume() {
   }
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 TRRServiceChannel::GetSecurityInfo(nsISupports** securityInfo) {
   NS_ENSURE_ARG_POINTER(securityInfo);
-  *securityInfo = mSecurityInfo;
-  NS_IF_ADDREF(*securityInfo);
+  *securityInfo = do_AddRef(mSecurityInfo).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 TRRServiceChannel::AsyncOpen(nsIStreamListener* aListener) {
   NS_ENSURE_ARG_POINTER(aListener);
   NS_ENSURE_TRUE(!LoadIsPending(), NS_ERROR_IN_PROGRESS);
   NS_ENSURE_TRUE(!LoadWasOpened(), NS_ERROR_ALREADY_OPENED);
@@ -1334,21 +1333,20 @@ TRRServiceChannel::ResumeAt(uint64_t aSt
 
 void TRRServiceChannel::DoAsyncAbort(nsresult aStatus) {
   Unused << AsyncAbort(aStatus);
 }
 
 NS_IMETHODIMP
 TRRServiceChannel::GetProxyInfo(nsIProxyInfo** result) {
   if (!mConnectionInfo) {
-    *result = mProxyInfo;
+    *result = do_AddRef(mProxyInfo).take();
   } else {
-    *result = mConnectionInfo->ProxyInfo();
+    *result = do_AddRef(mConnectionInfo->ProxyInfo()).take();
   }
-  NS_IF_ADDREF(*result);
   return NS_OK;
 }
 
 NS_IMETHODIMP TRRServiceChannel::GetHttpProxyConnectResponseCode(
     int32_t* aResponseCode) {
   NS_ENSURE_ARG_POINTER(aResponseCode);
 
   *aResponseCode = -1;
--- a/netwerk/protocol/http/nsHttpChannel.cpp
+++ b/netwerk/protocol/http/nsHttpChannel.cpp
@@ -5728,18 +5728,17 @@ nsHttpChannel::Resume() {
 
 //-----------------------------------------------------------------------------
 // nsHttpChannel::nsIChannel
 //-----------------------------------------------------------------------------
 
 NS_IMETHODIMP
 nsHttpChannel::GetSecurityInfo(nsISupports** securityInfo) {
   NS_ENSURE_ARG_POINTER(securityInfo);
-  *securityInfo = mSecurityInfo;
-  NS_IF_ADDREF(*securityInfo);
+  *securityInfo = do_AddRef(mSecurityInfo).take();
   return NS_OK;
 }
 
 // If any of the functions that AsyncOpen calls returns immediately an error
 // AsyncAbort(which calls onStart/onStopRequest) does not need to be call.
 // To be sure that they are not call ReleaseListeners() is called.
 // If AsyncOpen returns NS_OK, after that point AsyncAbort must be called on
 // any error.
@@ -6547,21 +6546,20 @@ nsHttpChannel::OnProxyAvailable(nsICance
 
 //-----------------------------------------------------------------------------
 // nsHttpChannel::nsIProxiedChannel
 //-----------------------------------------------------------------------------
 
 NS_IMETHODIMP
 nsHttpChannel::GetProxyInfo(nsIProxyInfo** result) {
   if (!mConnectionInfo) {
-    *result = mProxyInfo;
+    *result = do_AddRef(mProxyInfo).take();
   } else {
-    *result = mConnectionInfo->ProxyInfo();
-  }
-  NS_IF_ADDREF(*result);
+    *result = do_AddRef(mConnectionInfo->ProxyInfo()).take();
+  }
   return NS_OK;
 }
 
 //-----------------------------------------------------------------------------
 // nsHttpChannel::nsITimedChannel
 //-----------------------------------------------------------------------------
 
 NS_IMETHODIMP
--- a/netwerk/protocol/viewsource/nsViewSourceChannel.cpp
+++ b/netwerk/protocol/viewsource/nsViewSourceChannel.cpp
@@ -654,18 +654,17 @@ nsViewSourceChannel::GetIsSrcdocChannel(
 NS_IMETHODIMP
 nsViewSourceChannel::GetBaseURI(nsIURI** aBaseURI) {
   if (mIsSrcdocChannel) {
     nsCOMPtr<nsIInputStreamChannel> isc = do_QueryInterface(mChannel);
     if (isc) {
       return isc->GetBaseURI(aBaseURI);
     }
   }
-  *aBaseURI = mBaseURI;
-  NS_IF_ADDREF(*aBaseURI);
+  *aBaseURI = do_AddRef(mBaseURI).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsViewSourceChannel::SetBaseURI(nsIURI* aBaseURI) {
   mBaseURI = aBaseURI;
   return NS_OK;
 }
--- a/netwerk/protocol/websocket/BaseWebSocketChannel.cpp
+++ b/netwerk/protocol/websocket/BaseWebSocketChannel.cpp
@@ -89,32 +89,32 @@ BaseWebSocketChannel::GetURI(nsIURI** aU
   }
   return NS_OK;
 }
 
 NS_IMETHODIMP
 BaseWebSocketChannel::GetNotificationCallbacks(
     nsIInterfaceRequestor** aNotificationCallbacks) {
   LOG(("BaseWebSocketChannel::GetNotificationCallbacks() %p\n", this));
-  NS_IF_ADDREF(*aNotificationCallbacks = mCallbacks);
+  *aNotificationCallbacks = do_AddRef(mCallbacks).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 BaseWebSocketChannel::SetNotificationCallbacks(
     nsIInterfaceRequestor* aNotificationCallbacks) {
   LOG(("BaseWebSocketChannel::SetNotificationCallbacks() %p\n", this));
   mCallbacks = aNotificationCallbacks;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 BaseWebSocketChannel::GetLoadGroup(nsILoadGroup** aLoadGroup) {
   LOG(("BaseWebSocketChannel::GetLoadGroup() %p\n", this));
-  NS_IF_ADDREF(*aLoadGroup = mLoadGroup);
+  *aLoadGroup = do_AddRef(mLoadGroup).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 BaseWebSocketChannel::SetLoadGroup(nsILoadGroup* aLoadGroup) {
   LOG(("BaseWebSocketChannel::SetLoadGroup() %p\n", this));
   mLoadGroup = aLoadGroup;
   return NS_OK;
@@ -124,17 +124,17 @@ NS_IMETHODIMP
 BaseWebSocketChannel::SetLoadInfo(nsILoadInfo* aLoadInfo) {
   MOZ_RELEASE_ASSERT(aLoadInfo, "loadinfo can't be null");
   mLoadInfo = aLoadInfo;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 BaseWebSocketChannel::GetLoadInfo(nsILoadInfo** aLoadInfo) {
-  NS_IF_ADDREF(*aLoadInfo = mLoadInfo);
+  *aLoadInfo = do_AddRef(mLoadInfo).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 BaseWebSocketChannel::GetExtensions(nsACString& aExtensions) {
   LOG(("BaseWebSocketChannel::GetExtensions() %p\n", this));
   aExtensions = mNegotiatedExtensions;
   return NS_OK;
--- a/netwerk/streamconv/converters/nsDirIndexParser.cpp
+++ b/netwerk/streamconv/converters/nsDirIndexParser.cpp
@@ -110,17 +110,17 @@ nsresult nsDirIndexParser::Init() {
 NS_IMETHODIMP
 nsDirIndexParser::SetListener(nsIDirIndexListener* aListener) {
   mListener = aListener;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsDirIndexParser::GetListener(nsIDirIndexListener** aListener) {
-  NS_IF_ADDREF(*aListener = mListener.get());
+  *aListener = do_AddRef(mListener).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsDirIndexParser::GetComment(char** aComment) {
   *aComment = ToNewCString(mComment, mozilla::fallible);
 
   if (!*aComment) return NS_ERROR_OUT_OF_MEMORY;
--- a/netwerk/streamconv/converters/nsMultiMixedConv.cpp
+++ b/netwerk/streamconv/converters/nsMultiMixedConv.cpp
@@ -207,19 +207,17 @@ nsPartChannel::SetTRRMode(nsIRequest::TR
 
 NS_IMETHODIMP
 nsPartChannel::GetIsDocument(bool* aIsDocument) {
   return NS_GetIsDocumentChannel(this, aIsDocument);
 }
 
 NS_IMETHODIMP
 nsPartChannel::GetLoadGroup(nsILoadGroup** aLoadGroup) {
-  *aLoadGroup = mLoadGroup;
-  NS_IF_ADDREF(*aLoadGroup);
-
+  *aLoadGroup = do_AddRef(mLoadGroup).take();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsPartChannel::SetLoadGroup(nsILoadGroup* aLoadGroup) {
   mLoadGroup = aLoadGroup;
 
   return NS_OK;
@@ -370,18 +368,17 @@ nsPartChannel::GetEndRange(int64_t* aEnd
   *aEndRange = mByteRangeEnd;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsPartChannel::GetBaseChannel(nsIChannel** aReturn) {
   NS_ENSURE_ARG_POINTER(aReturn);
 
-  *aReturn = mMultipartChannel;
-  NS_IF_ADDREF(*aReturn);
+  *aReturn = do_AddRef(mMultipartChannel).take();
   return NS_OK;
 }
 
 // nsISupports implementation
 NS_IMPL_ISUPPORTS(nsMultiMixedConv, nsIStreamConverter, nsIStreamListener,
                   nsIRequestObserver)
 
 // nsIStreamConverter implementation
--- a/netwerk/test/browser/browser_fetch_lnk.js
+++ b/netwerk/test/browser/browser_fetch_lnk.js
@@ -1,18 +1,14 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 add_task(async () => {
-  await SpecialPowers.pushPrefEnv({
-    set: [["privacy.file_unique_origin", false]],
-  });
-
   const FILE_PAGE = Services.io.newFileURI(
     new FileUtils.File(getTestFilePath("dummy.html"))
   ).spec;
   await BrowserTestUtils.withNewTab(FILE_PAGE, async browser => {
     try {
       await SpecialPowers.spawn(browser, [], () =>
         content.fetch("./file_lnk.lnk")
       );
--- a/netwerk/url-classifier/AsyncUrlChannelClassifier.cpp
+++ b/netwerk/url-classifier/AsyncUrlChannelClassifier.cpp
@@ -71,17 +71,17 @@ class URIData {
   bool IsEqual(nsIURI* aURI) const;
 
   const nsTArray<nsCString>& Fragments();
 
   nsIURI* URI() const;
 
  private:
   URIData();
-  ~URIData();
+  ~URIData() = default;
 
   nsCOMPtr<nsIURI> mURI;
   nsCString mURISpec;
   nsTArray<nsCString> mFragments;
   nsIUrlClassifierFeature::URIType mURIType;
 };
 
 /* static */
@@ -112,18 +112,16 @@ nsresult URIData::Create(nsIURI* aURI, n
        data->mURISpec.get(), data.get()));
 
   data.forget(aData);
   return NS_OK;
 }
 
 URIData::URIData() { MOZ_ASSERT(NS_IsMainThread()); }
 
-URIData::~URIData() { NS_ReleaseOnMainThread("URIData:mURI", mURI.forget()); }
-
 bool URIData::IsEqual(nsIURI* aURI) const {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(aURI);
 
   bool isEqual = false;
   nsresult rv = mURI->Equals(aURI, &isEqual);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return false;
--- a/python/mach/mach/sentry.py
+++ b/python/mach/mach/sentry.py
@@ -49,17 +49,19 @@ class NoopErrorReporter(ErrorReporter):
 
 
 def register_sentry(argv, settings, topsrcdir):
     if not is_telemetry_enabled(settings):
         return NoopErrorReporter()
 
     global _is_unmodified_mach_core_thread
     _is_unmodified_mach_core_thread = Thread(
-        target=_is_unmodified_mach_core, args=[topsrcdir]
+        target=_is_unmodified_mach_core,
+        args=[topsrcdir],
+        daemon=True,
     )
     _is_unmodified_mach_core_thread.start()
 
     sentry_sdk.init(
         _SENTRY_DSN, before_send=lambda event, _: _process_event(event, topsrcdir)
     )
     sentry_sdk.add_breadcrumb(message="./mach {}".format(" ".join(argv)))
     return SentryErrorReporter()
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1144,9 +1144,9 @@ static const TransportSecurityPreload kP
   { "za.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "zh.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
 };
 
 // Pinning Preload List Length = 495;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1642675615870000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1643021232351000);
--- a/security/manager/ssl/nsSTSPreloadList.inc
+++ b/security/manager/ssl/nsSTSPreloadList.inc
@@ -3,17 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /*****************************************************************************/
 /* This is an automatically generated file. If you're not                    */
 /* nsSiteSecurityService.cpp, you shouldn't be #including it.                */
 /*****************************************************************************/
 
 #include <stdint.h>
-const PRTime gPreloadListExpirationTime = INT64_C(1645094807534000);
+const PRTime gPreloadListExpirationTime = INT64_C(1645440425708000);
 %%
 0--1.de, 1
 0-1.party, 1
 0-24.com, 1
 0-24.net, 1
 00.eco, 1
 00000000-0000-0000-0000-000000000000.xyz, 1
 00010110.nl, 1
@@ -895,16 +895,17 @@ 1234365q.com, 1
 1234365s.com, 1
 1234365t.com, 1
 1234365u.com, 1
 1234365v.com, 1
 1234365vip.com, 1
 1234365w.com, 1
 1234365x.com, 1
 1234365y.com, 1
+1234365z.com, 0
 12345.lv, 1
 12345678365.com, 1
 123456789365.com, 1
 12345porn.com, 1
 1234666365.com, 1
 1236.be, 1
 12365t.com, 1
 123ali.ir, 1
@@ -1992,18 +1993,16 @@ 260150.com, 1
 262569.com, 1
 269196.com, 1
 2698pacificave.com, 1
 26bbc.com, 1
 26ce.com, 1
 26ck.com, 1
 26gt.com, 1
 26ja.com, 1
-26nc.com, 1
-26nd.com, 1
 26pg.com, 1
 26pn.com, 1
 26sn.com, 1
 26sr.com, 1
 26ssb.com, 1
 26uuu.info, 1
 26uuu.mobi, 1
 26uuu.us, 1
@@ -2141,19 +2140,17 @@ 300bbbb.com, 1
 300cccc.com, 1
 300dddd.com, 1
 300hhhh.com, 1
 300jjjj.com, 1
 300kkkk.com, 1
 300llll.com, 1
 300mmmm.com, 1
 300oooo.com, 1
-300qqqq.com, 1
 300rrrr.com, 1
-300uuuu.com, 1
 300xxxx.com, 1
 301.moe, 1
 301.technology, 1
 302422.com, 1
 3033888.com, 1
 303422.com, 1
 30375500.com, 1
 30375533.com, 1
@@ -2194,17 +2191,16 @@ 317844444.com, 1
 317855555.com, 1
 31786666.com, 1
 317866666.com, 1
 3178666666.com, 1
 317877777.com, 1
 3178888888.com, 1
 31789999.com, 1
 317899999.com, 1
-3178aaa.com, 1
 3178b.com, 1
 3178bbb.com, 1
 3178c.com, 1
 3178ccc.com, 1
 3178dd.com, 1
 3178ddd.com, 1
 3178e.com, 1
 3178eee.com, 1
@@ -2623,17 +2619,16 @@ 371422.com, 1
 371cloud.com, 0
 372bbb.com, 1
 373.moe, 1
 373422.com, 1
 374933.com, 1
 375422.com, 1
 377625.com, 1
 377632.com, 1
-3778vip.com, 0
 377ks.com, 1
 377zzz.com, 1
 37879.com, 0
 37889658.com, 0
 378901.com, 1
 378902.com, 1
 378bbb.com, 1
 379700.com, 1
@@ -2705,18 +2700,23 @@ 394522.com, 1
 394553.com, 1
 394622.com, 1
 394922.com, 1
 3957b.com, 1
 3957d.com, 1
 3957f.com, 1
 3957g.com, 1
 396228.com, 1
+396301.com, 0
+396303.com, 0
+396304.com, 0
+396305.com, 0
 3963aa.com, 1
 3963bb.com, 1
+3963cc.com, 0
 3963dd.com, 1
 396422.com, 1
 3970a.com, 1
 3970aa.com, 1
 3970abc.com, 1
 3970b.com, 1
 3970bb.com, 1
 3970c.com, 1
@@ -2835,17 +2835,16 @@ 3em1.pt, 1
 3ff365.com, 1
 3gdev.com, 1
 3gdu.tk, 1
 3gg365.com, 1
 3h-co.de, 1
 3haeuserprojekt.org, 1
 3haueserprojekt.org, 1
 3hh365.com, 1
-3hl0.net, 1
 3i-infotech.com, 1
 3ii365.com, 1
 3james.com, 1
 3jj365.com, 1
 3ks.pl, 1
 3lmnyblogger.ga, 1
 3logic.ru, 1
 3lot.ru, 1
@@ -2944,30 +2943,24 @@ 3zzbet.com, 1
 4-0-4.ga, 1
 4-1-where.com, 1
 4-it.de, 1
 4000milestare.com, 1
 4000ok.com, 1
 4000sf.com, 1
 40010monogatari.com, 1
 4005365.com, 1
-400bbbb.com, 1
-400cccc.com, 1
 400eeee.com, 1
 400gggg.com, 1
 400iiii.com, 1
-400jjjj.com, 1
 400llll.com, 1
 400nnnn.com, 1
-400pppp.com, 1
 400tttt.com, 1
 400uuuu.com, 1
-400vvvv.com, 1
 400yaahc.gov, 1
-400yyyy.com, 1
 4025360.com, 1
 4025361.com, 1
 4025362.com, 1
 4025363.com, 1
 4025364.com, 1
 4025365.com, 1
 4025366.com, 1
 4025367.com, 1
@@ -3313,17 +3306,16 @@ 4hw.ru, 1
 4hypo.cz, 1
 4iners.com, 1
 4investors.de, 1
 4iplatform.com, 1
 4k3dyptt.com, 1
 4kitchenknives.com, 1
 4kpi.eu, 1
 4kprojektory.cz, 1
-4kvids.com, 1
 4lados.tk, 1
 4lephants.tk, 1
 4list.ml, 1
 4loc.us, 1
 4lock.com.br, 1
 4mama.ua, 1
 4maniacos.tk, 1
 4meizu.ru, 1
@@ -3380,26 +3372,23 @@ 5000164.jp, 1
 5000yz.com, 1
 5002888.com, 1
 5007999.com, 1
 500bbbb.com, 1
 500dddd.com, 1
 500eeee.com, 1
 500fcw.com, 1
 500foods.com, 1
-500iiii.com, 1
-500jjjj.com, 1
 500k.nl, 1
 500k8.com, 1
 500mmmm.com, 1
 500nnnn.com, 1
 500p.xyz, 1
 500promokodov.ru, 1
 500qqqq.com, 1
-500rrrr.com, 1
 500tttt.com, 1
 500uuuu.com, 1
 500vvvv.com, 1
 500wordessay.gq, 1
 500zzzz.com, 1
 5017501.com, 1
 5017502.com, 1
 5017503.com, 1
@@ -3776,26 +3765,23 @@ 5thchichesterscouts.org.uk, 1
 5thgenrams.com, 1
 5y.fi, 1
 5yeb.com, 0
 6.vu, 1
 600aaaa.com, 1
 600bbbb.com, 1
 600cao.com, 1
 600dddd.com, 1
-600iiii.com, 1
 600k8.com, 1
 600kkkk.com, 1
-600llll.com, 1
 600mmmm.com, 1
 600pppp.com, 1
 600ssss.com, 1
 600tttt.com, 1
 600vvvv.com, 1
-600wwww.com, 1
 600xxxx.com, 1
 602422.com, 1
 602yb.com, 1
 603yb.com, 1
 604122.com, 1
 604322.com, 1
 604522.com, 1
 604622.com, 1
@@ -3908,16 +3894,17 @@ 639688888.com, 1
 63969999.com, 1
 639699999.com, 1
 6396aaa.com, 1
 6396bbb.com, 1
 6396ccc.com, 1
 6396ddd.com, 1
 6396eee.com, 1
 6396fff.com, 1
+6396ggg.com, 0
 6396iii.com, 1
 6396jjj.com, 1
 6396ooo.com, 1
 6396qqq.com, 1
 6396rrr.com, 1
 6396sss.com, 1
 6396ttt.com, 1
 6396vvv.com, 1
@@ -4405,26 +4392,19 @@ 6play.fr, 1
 6qubedirectory.com, 1
 6t-montjoye.org, 1
 6thmarch.com, 1
 6upagent.com, 1
 6wbz.com, 1
 7-it.ml, 1
 700.az, 1
 700bbbb.com, 1
-700cccc.com, 1
 700dddd.com, 1
-700gggg.com, 1
-700hhhh.com, 1
-700iiii.com, 1
-700mmmm.com, 1
 700uuuu.com, 1
 700wns.com, 1
-700yyyy.com, 1
-700zzzz.com, 1
 701605.com, 1
 701squad.tk, 1
 70365365.com, 0
 704233.com, 1
 704533.com, 1
 704633.com, 1
 705994.com, 1
 708090.ru, 1
@@ -4711,31 +4691,27 @@ 80001234.com, 1
 8001d.com, 1
 8001d88.com, 1
 8003pay.com, 1
 8006d.com, 1
 8006d88.com, 1
 8007d88.com, 1
 800999.xyz, 1
 800bbbb.com, 1
-800cccc.com, 1
 800dddd.com, 1
 800eeee.com, 1
 800hhhh.com, 1
 800iiii.com, 1
 800kkkk.com, 1
 800llll.com, 1
-800nnnn.com, 1
 800qqqq.com, 1
 800rrrr.com, 1
 800sf.com, 1
 800vvvv.com, 1
 800wwww.com, 1
-800xxxx.com, 1
-800zzzz.com, 1
 8010d88.com, 1
 8012d88.com, 1
 8017d.com, 1
 8017d88.com, 1
 8019d88.com, 1
 8020d88.com, 1
 8021d.com, 1
 8022d.com, 1
@@ -5082,16 +5058,17 @@ 861365e.com, 1
 861365f.com, 1
 861365g.com, 1
 861365h.com, 1
 861365i.com, 1
 861365j.com, 1
 861365k.com, 1
 861365l.com, 1
 861365m.com, 1
+861365n.com, 0
 861365o.com, 1
 861365q.com, 1
 861365r.com, 1
 861365s.com, 1
 861365t.com, 1
 861365u.com, 1
 861365v.com, 1
 861365vip.com, 1
@@ -5338,32 +5315,28 @@ 8y.network, 1
 8yabo.com, 1
 8yun.cf, 1
 8yun.ga, 0
 9-11commission.gov, 1
 9005424.com, 1
 9009019.com, 1
 900aaaa.com, 1
 900bbbb.com, 1
-900cccc.com, 1
 900dddd.com, 1
-900eeee.com, 1
 900gggg.com, 1
 900hosting.com, 1
 900iiii.com, 1
 900jjjj.com, 1
 900k8.com, 1
 900nnnn.com, 1
 900pk.com, 1
 900qqqq.com, 1
-900tttt.com, 1
 900uuuu.com, 1
 900wwww.com, 1
 900yyyy.com, 1
-900zzzz.com, 1
 901543.com, 1
 903422.com, 1
 905422.com, 1
 906vv.com, 1
 908vv.com, 1
 90920.cn, 1
 90daydiet.org, 1
 90r.jp, 1
@@ -6718,31 +6691,29 @@ acecerts.co.uk, 1
 acectamentit.tk, 1
 acedstudy.com, 1
 acefishing.tk, 1
 acefreightco.com, 1
 aceinflatables.com, 1
 aceinstituteonline.com, 1
 aceitedelcampo.com, 1
 aceleraguria.com.br, 1
-aceleratuweb.com, 1
 acelpb.com, 1
 acem.org.au, 1
 acemadeira.pt, 1
 acemobileforce.com, 1
 acemsa.ga, 1
 acemypaper.com, 1
 acendealuz.com.br, 1
 aceofdiamondspainting.com, 1
 aceparking.com, 1
 acephalafashion.com, 1
 acercapartners.com, 1
 acerentalandsales.com, 1
 acerislaw.com, 1
-acerosfortuna.com.mx, 1
 acerostrevino.com.mx, 1
 aceshop702.com, 1
 acessoeducacao.com, 1
 acetudy.com, 1
 aceweb.ga, 1
 acftienda.tk, 1
 acfun.eu.org, 1
 acg.mn, 1
@@ -7060,16 +7031,17 @@ adamjoycegames.co.uk, 1
 adamkostecki.de, 1
 adamlevine.ga, 1
 adamliu.net, 0
 adamoutler.com, 1
 adamov.tk, 1
 adamradocz.com, 1
 adamraoof.tk, 1
 adamricheimer.com, 1
+adams-gonczi.fun, 1
 adams.dk, 1
 adams.es, 1
 adamsasphaltpaving.com, 1
 adamscampcolorado.org, 1
 adamschmuck.de, 1
 adamscountyil.gov, 1
 adamscountypa.gov, 1
 adamstas.com, 1
@@ -7089,16 +7061,17 @@ adaptivemechanics.edu.au, 1
 adaptivesite.cf, 1
 adaptivesite.gq, 1
 adaptiveu.io, 1
 adaptsolvents.com, 1
 adaptyourlifeacademy.com, 1
 adarixconsultores.com, 1
 adarshcloud.in, 1
 adarshthapa.in, 1
+adarshthapa.net, 0
 adarsvidler.me, 1
 adasbench.com, 1
 adata.kz, 1
 adativos.com.br, 1
 adauge.com, 1
 adawolfa.cz, 1
 adayinthelifeof.nl, 1
 adblock.ovh, 1
@@ -7488,17 +7461,16 @@ adventurecreators.com, 1
 adventuredrives.com, 0
 adventurefishinggear.com, 1
 adventureforest.co.nz, 1
 adventureforest.de, 0
 adventureforest.nz, 1
 adventuregamers.com, 1
 adventurenow.nl, 1
 adventureprooutdoors.com, 1
-adventures-abroad.com, 1
 adventures.com, 1
 adventuresinparanoia.com, 1
 adventureswithlillie.ca, 1
 adventureworldtour.com, 1
 adventuringup.com, 1
 adventurousway.com, 1
 adventus.space, 1
 advercarte.com, 1
@@ -7527,16 +7499,17 @@ advocator.ca, 1
 advoervice.ga, 1
 advogatech.com.br, 1
 advokat-dtp.cf, 1
 advokat-dtp.ga, 1
 advokat-dtp.gq, 1
 advokat-dtp.ml, 1
 advokat-dtp.tk, 1
 advokat-malinovskii.ml, 1
+advokat-romanov.com, 1
 advokat-vvp.com.ua, 1
 advokat73.gq, 1
 advokati-ceva.cz, 1
 advokatkonsult.cf, 1
 advokatonline.ml, 1
 advokatskoe-byuro.ml, 1
 advokaty-onlajn.cf, 1
 advokaty-onlajn.ga, 1
@@ -8213,17 +8186,16 @@ agrargruppe.tk, 1
 agraw.tk, 1
 agregator.tk, 1
 agrekov.ru, 1
 agremo.com, 0
 agrente.pl, 1
 agreor.com, 1
 agri-meet.com, 1
 agri.ee, 1
-agrichamber.com.ua, 1
 agricult.tk, 1
 agricultural-technology.tk, 1
 agriculture-schools.com, 1
 agrifoodtoday.it, 1
 agrigentonotizie.it, 1
 agrikulturchic.com, 1
 agripartner.fr, 1
 agrippa.tk, 1
@@ -8682,17 +8654,16 @@ airplayradio.nl, 1
 airpoint-compressors.nl, 1
 airport-car-rental.tk, 1
 airport-charlotte.com, 1
 airportal.cn, 1
 airportbarking.eu, 1
 airportcoc.cf, 1
 airportcoc.ga, 1
 airportcoc.ml, 1
-airportlimototoronto.com, 1
 airportstuttgart.com, 1
 airporttaxibudapest.com, 1
 airporttransferbudapest.co.uk, 1
 airporttransferbudapest.com, 1
 airpurifierproductsonline.com, 1
 airquestion.org, 1
 airrestoration.ch, 1
 airseatac.net, 1
@@ -9276,16 +9247,17 @@ alexandertechniquenow.com, 1
 alexandertutoring.com, 1
 alexanderwagner.tk, 1
 alexandra-schulze.de, 1
 alexandraandnicolay.com, 1
 alexandraschmidt.coach, 1
 alexandrastrauss.fr, 1
 alexandrawett.net, 1
 alexandre-acaries.fr, 1
+alexandre-barret.fr, 1
 alexandre-gallais.fr, 1
 alexandreguarita.com.br, 1
 alexandremottier.tk, 1
 alexandrevicente.net, 1
 alexandrite.cf, 1
 alexandros.io, 0
 alexandryimmobilier.fr, 1
 alexaprinting.tk, 1
@@ -10223,16 +10195,17 @@ alza.at, 1
 alza.co.uk, 1
 alza.cz, 1
 alza.de, 1
 alza.hu, 1
 alza.sk, 1
 alzashop.com, 1
 alziamoiltetto.it, 1
 alzon.cf, 1
+alzulej.pt, 1
 am-39.com, 1
 am-dd.com, 1
 am-executive-consulting.com, 1
 am-i-on-am-i-on-drugs-dot-com.com, 1
 am-i-on-drugs.com, 1
 am-liaotian.com, 0
 am-schlossgarten.haus, 1
 am-sonnenblick.de, 1
@@ -10626,16 +10599,17 @@ amoxicillincapsules.tk, 1
 amoxicillinonline.tk, 1
 amoxil.cf, 1
 amoxil.ga, 1
 amoxil875.ga, 1
 amoxilonline.gq, 1
 amp-logistics.com, 1
 amped4ski.co.nz, 1
 amper.kharkov.ua, 1
+amperaa.net, 1
 ampersandnbspsemicolon.com, 1
 ampetronic.com, 1
 ampgroep.nl, 1
 amphetamines.org, 1
 amphibo.ly, 1
 amphora.jp, 1
 amphora.tk, 1
 amphost.tk, 1
@@ -12402,16 +12376,17 @@ arch-design.com, 1
 archaeoadventures.com, 1
 archaeology.lk, 1
 archambault.paris, 1
 archangelbio.com, 1
 archauthority.com, 1
 archbishop.ga, 1
 archdetal.com.ua, 1
 archeologicatoscana.it, 1
+archeologiegorinchem.com, 1
 archerconsulting.llc, 1
 archerlong.com, 1
 archerlongx.com, 1
 archerxlong.com, 1
 archery.land, 1
 archeton.ga, 1
 archframe.net, 1
 archi.net.tw, 1
@@ -12633,16 +12608,17 @@ ariston-center.gq, 1
 aristotle.tk, 1
 aritec-la.com, 1
 arithmetic.ga, 1
 aritmetic.com, 1
 arivo.com.br, 1
 arizona-fake.tk, 1
 arizonaautomobileclub.com, 1
 arizonabondedtitle.com, 1
+arizonamasterworks.com, 1
 arizonaonlinedivorce.com, 1
 arizonatech.tk, 1
 arjan.nl, 1
 arjandejong.eu, 1
 arjanenthijs.nl, 1
 arjansteevels.nl, 1
 arjanvaartjes.net, 1
 arjen-robben.tk, 1
@@ -13010,16 +12986,17 @@ artiwear.com.tw, 1
 artizlibranza.com, 1
 artj.jp, 1
 artk-co.ir, 1
 artkins.ca, 1
 artlab.tk, 1
 artlantis.nl, 1
 artleading.ru, 1
 artlifeisgood.com, 1
+artlinestix.com.au, 1
 artlogo.biz, 1
 artlogo.cz, 1
 artlogo.sk, 1
 artmarketingnews.com, 1
 artmaterials.com.ua, 1
 artmaxi.eu, 1
 arto.bg, 1
 artofclouds.ru, 0
@@ -13084,17 +13061,16 @@ arvindhariharan.me, 1
 arvutiladu.ee, 1
 arvyncerezo.com, 1
 arw.me, 1
 arwensiberian.tk, 1
 arweth.com, 1
 arx-libertatis.org, 1
 arx.vg, 1
 arx8x.net, 1
-arxcs.com, 1
 aryabusines.com, 1
 aryacollege.me, 1
 aryalaroca.de, 1
 aryan-nation.com, 1
 aryani-fitriana.tk, 1
 aryankhera.xyz, 1
 aryasenna.net, 1
 aryescommercial.com, 1
@@ -13251,17 +13227,17 @@ ashutov.rocks, 0
 ashwainfo.in, 1
 asia-gazette.com, 1
 asia-global-risk.com, 1
 asia.dating, 1
 asiacommerce.id, 1
 asiaflash.com, 1
 asiafood-curator.com, 1
 asiagate.ga, 1
-asiahabit.com, 1
+asiahabit.com, 0
 asiaheavens.com, 1
 asiakartu.tk, 1
 asialeonding.at, 1
 asialivenewscafe.gq, 1
 asian-archi.com.tw, 1
 asian-goku.tk, 1
 asian-industry.eu, 1
 asian-sirens.net, 1
@@ -13330,17 +13306,18 @@ asla.info, 1
 aslamazyan.tk, 1
 aslinfinity.com, 1
 asm.io, 1
 asm802.com, 1
 asm802.es, 1
 asmbsurvey.com, 1
 asmdz.com, 1
 asmeets.nl, 1
-asmm.cc, 0
+asmita.ru, 1
+asmm.cc, 1
 asmobox.ga, 1
 asmood.net, 1
 asmrbuluo.com, 0
 asmui.ml, 1
 asmuncandle.com, 1
 asngear.biz, 1
 asniereslesdijon.fr, 1
 asoagroca.com, 1
@@ -13552,17 +13529,16 @@ astural.org, 0
 asturhackers.es, 1
 astutikhonda.com, 1
 astutr.co, 1
 astyork.com, 1
 astypic.fr, 1
 asua.ca, 1
 asuamaytinh.com, 1
 asucrews.com, 1
-asuhe.win, 1
 asukalangley.tk, 1
 asun.co, 1
 asur.store, 1
 asurbernardo.com, 1
 asurepay.cc, 0
 asurgiant.ca, 1
 asustor.com, 1
 asustreiber.de, 1
@@ -13857,17 +13833,16 @@ atugan.com, 1
 atunel.tk, 1
 atvirtual.at, 1
 atvsafety.gov, 1
 atwar-mod.com, 1
 atwatermn.gov, 1
 atwonline.org, 1
 atxchirocoverage.com, 1
 atxtraumatherapycenter.com, 1
-atyafesolutions.com, 1
 atyourleisureculinary.com, 1
 atyourprice.net, 1
 atypicom.es, 1
 atypicom.fr, 1
 atypicom.it, 1
 atypicom.pt, 1
 atyuan.me, 1
 atyuan.one, 1
@@ -14214,16 +14189,17 @@ autoepc.ro, 1
 autoexprez.com, 1
 autofficina.roma.it, 1
 autofinancing.ga, 1
 autofolderstekoop.nl, 1
 autofornal.pl, 1
 autofresh.tk, 1
 autogear.ga, 1
 autoglass.com.my, 1
+autograder.ml, 1
 autohausmf-nord.de, 1
 autohaussued.de, 1
 autohit.ro, 1
 autohomehub.com, 1
 autohunt.ga, 1
 autohut.ca, 1
 autoi.ch, 1
 autoinfa.tk, 1
@@ -14480,17 +14456,17 @@ autosystem.co.uk, 1
 autoteched.com, 1
 autotechschool.com, 0
 autoteplo.org, 1
 autoterminus-used.be, 0
 autotimez.com, 1
 autotitleloansnu.ga, 1
 autoto.hr, 1
 autotonic.tk, 1
-autotrac.com.br, 0
+autotrac.com.br, 1
 autotransportquoteservices.com, 1
 autotras.com, 1
 autotyreprest.ro, 1
 autouncle.at, 1
 autouncle.co.uk, 1
 autouncle.com, 1
 autouncle.de, 1
 autouncle.dk, 1
@@ -14510,17 +14486,16 @@ autoviral.gq, 1
 autoviral.ml, 1
 autoviral.tk, 1
 autovolo.co.uk, 1
 autowallpapers.tk, 1
 autowatch.tk, 1
 autowerkstatt-puchheim.de, 1
 autozaz.ml, 1
 autozuki.com, 1
-autre.cn, 1
 autres-talents.fr, 1
 autshir.com, 1
 autumnhungary.tk, 1
 auturoa.nz, 1
 autya.ga, 1
 auvernet.org, 1
 auvidos.ru, 1
 aux-arts-de-la-table.com, 1
@@ -14770,16 +14745,17 @@ avogel.si, 1
 avogelusa.com, 1
 avoids-troops.gq, 1
 avoinna24.fi, 1
 avoka.do, 1
 avondaleestatesga.gov, 1
 avonlearningcampus.com, 1
 avonture.be, 1
 avonvets.co.uk, 1
+avova.de, 1
 avpres.net, 0
 avptp.org, 1
 avqueen.cn, 1
 avrilhouse.tk, 1
 avrilshine.tk, 1
 avrora-nov.ru, 1
 avroramine.tk, 1
 avspace.asia, 1
@@ -15344,16 +15320,17 @@ b9498.com, 1
 b9586.net, 1
 b9588.net, 1
 b95888.net, 1
 b9589.net, 1
 b960.com, 1
 b96899.com, 1
 b9728.co, 1
 b979333.com, 1
+b979365.com, 0
 b979555.com, 1
 b979666.com, 1
 b979999.com, 1
 b9883.net, 1
 b9884.net, 1
 b9885.net, 1
 b9886.com, 1
 b9886.net, 1
@@ -15403,16 +15380,17 @@ b9999jj.com, 1
 b9999ll.com, 1
 b9999mm.com, 1
 b9999nn.com, 1
 b9999oo.com, 1
 b9999pp.com, 1
 b9999qq.com, 1
 b9999tt.com, 1
 b9999vv.com, 1
+b9999ww.com, 0
 b9999yy.com, 1
 b9999zz.com, 1
 b99iosapp.com, 1
 b9winner.com, 1
 ba47.net, 1
 ba7rain.tk, 1
 baac-dewellmed.com, 1
 baalajimaestro.me, 1
@@ -17398,17 +17376,16 @@ bergwandercamp.de, 1
 bergwandercamp.eu, 1
 bergwandercamp.info, 1
 berhampore-gateway.tk, 1
 berichandcreamy.com, 1
 berichtsheft-vorlage.de, 1
 berightthere.eu, 1
 berikod.ru, 1
 beris.us, 1
-berita.press, 0
 beritalima.com, 1
 beritamotor.tk, 1
 beritanow.tk, 1
 beritatopbanten.com, 0
 berjou.me, 1
 berk.tk, 1
 berkat-luqs.ddns.net, 1
 berkbrands.com, 1
@@ -17510,17 +17487,16 @@ bescoutednow.com, 1
 besedovichi.tk, 1
 besensi.com, 1
 beserberg.tk, 1
 besiconstruct.be, 1
 besidemetal.tk, 1
 besnard.me, 1
 besnik.de, 0
 besnik.tk, 1
-besola.de, 1
 besole.ch, 1
 besolov.tk, 1
 besonders-s.at, 1
 besox.be, 1
 bespaarenergie.click, 1
 bespaarnu.click, 1
 bespoiled.nl, 1
 bespokebathrooms.com.au, 1
@@ -17861,16 +17837,17 @@ bestweleenbeetje.nl, 1
 bestwigs.ga, 1
 bestwirelessdoorbell.ml, 1
 bestwriterjobs.tk, 1
 bestzoo.tk, 1
 besured.nl, 1
 besv.com, 1
 beszerzokozpont.hu, 1
 bet-platform.com, 1
+bet031.com, 0
 bet03vip.com, 0
 bet064.com, 1
 bet06vip.com, 1
 bet074.com, 1
 bet08vip.com, 1
 bet09vip.com, 1
 bet166111.com, 1
 bet166333.com, 1
@@ -18303,17 +18280,17 @@ bghost.xyz, 1
 bgjargon.com, 1
 bgkoleda.bg, 1
 bglobal.com, 1
 bglsingles.de, 1
 bgm.bg, 1
 bgmall.tk, 1
 bgmedia.tk, 1
 bgmn.me, 1
-bgmsquad.com, 1
+bgmsquad.com, 0
 bgp.space, 1
 bgr34.cz, 1
 bgs-game.com, 1
 bgtoyou.com, 1
 bgtraffic.tk, 1
 bguidinger.com, 1
 bh-oberland.de, 1
 bh.sb, 1
@@ -18411,16 +18388,17 @@ bic.co.bw, 1
 bicecontracting.com, 1
 bicha.net, 1
 bichonfrise.com.br, 1
 bichonmaltes.com.br, 1
 bicicletassym.com, 1
 bicicletassym.com.co, 1
 bicignet.ga, 1
 bicommarketing.com, 1
+bicranial.io, 0
 bicromoestudio.com, 1
 bicstone.me, 1
 bicubic.tk, 1
 bicycle-events.com, 1
 bicycle-works.com, 1
 bicycleframeiz.com, 1
 bidaah.tk, 1
 bidadari.my, 1
@@ -18771,17 +18749,17 @@ bingofriends.com, 1
 bingohalls.ca, 1
 bingospelen.tk, 1
 bingothemesers.ga, 1
 bingothemesest.ga, 1
 bingowinkel.nl, 1
 binhdang.me, 0
 binhex.net, 1
 binhminhpc.com, 1
-bini-solution.com, 1
+bini-solution.com, 0
 binimo.com, 1
 biniou.net, 1
 binkanhada.biz, 1
 binkconsulting.be, 1
 binnenmeer.de, 1
 binoculars.ga, 1
 binoqlo.com, 1
 binoro.de, 1
@@ -19186,16 +19164,17 @@ bitrate.tk, 1
 bitref.com, 1
 bitrefill.com, 1
 bitrefill.info, 1
 bitrefill.me, 1
 bitroll.com, 0
 bitrush.nl, 1
 bits-hr.de, 0
 bitsafe.com.my, 1
+bitsalt.com, 1
 bitsellx.com, 1
 bitseo.ga, 1
 bitseo.tk, 1
 bitshaker.net, 1
 bitsight.net, 1
 bitsite.com, 1
 bitski.com, 1
 bitskins.co, 1
@@ -19279,17 +19258,16 @@ biznesonline.info, 1
 biznet.tk, 1
 bizniskatalog.mk, 1
 biznpro.ru, 1
 bizophub.com, 1
 bizor.tk, 1
 bizpay.su, 1
 bizprom.ga, 1
 bizstart.ga, 1
-bizstarter.cz, 1
 bizsugar.ga, 1
 bizteam.ga, 1
 biztera.com, 1
 biztok.eu, 1
 biztouch.work, 1
 bizuteria-laoni.tk, 1
 bizuteria-naprezent-szczecin.ml, 1
 bizzdesign.com, 1
@@ -19596,17 +19574,16 @@ bleedmoneyest.ga, 1
 bleekerenbleeker.nl, 1
 bleep-it.be, 1
 bleep.zone, 1
 bleepplc.co.uk, 1
 blegalservicespty.com, 1
 blekingeopen.tk, 1
 blenderinsider.com, 1
 blenderrecipereviews.com, 1
-blenderwallet.io, 1
 blendessencial.com, 1
 blending.kr, 1
 blendle.com, 1
 blendle.nl, 1
 blendr.com, 1
 blendstudios.com, 1
 blenneros.net, 0
 blero.tk, 1
@@ -19631,16 +19608,17 @@ blijfbij.com, 1
 blijfbij.eu, 1
 bliker.ga, 1
 blikund.swedbank.se, 1
 blindaryproduction.tk, 1
 blindfold.cf, 1
 blindfold.ga, 1
 blindpigandtheacorn.com, 1
 blinds-unlimited.com, 1
+blindscribblings.com, 1
 blindsjoburg.com, 1
 blingbusinessest.ga, 1
 blingsparkleshine.com, 1
 blingwang.cn, 0
 blink-security.com, 1
 blinkdir.tk, 1
 blinkdrivex.com, 1
 blinken.co, 1
@@ -19782,16 +19760,17 @@ blogotomia.tk, 1
 blogpark.tk, 1
 blogpress.co.il, 1
 blogpronto.com.br, 1
 blogreen.org, 1
 blogsked.com, 1
 blogsnote.xyz, 1
 blogspasest.ga, 1
 blogstar.tk, 1
+blogtechnologiczny.pl, 1
 blogthetindung.com, 1
 blogtroterzy.pl, 1
 bloguser.ru, 1
 blogvadim.ga, 1
 blokmap.be, 1
 blokuhaka.fr, 1
 blomberg.name, 1
 blomberguk.com, 1
@@ -19886,28 +19865,26 @@ bluelily.ga, 1
 blueliquiddesigns.com.au, 1
 bluemail24.com, 1
 bluemango-studios.com, 1
 bluemanhoop.com, 1
 bluemoonrescue.org, 1
 bluemosh.com, 1
 bluemtnrentalmanagement.ca, 1
 bluenailsstudio.nl, 1
-bluenet-26.com, 1
 blueneuron.tk, 1
 blueoakart.com, 1
 blueparrotpainting.com, 1
 bluepearl.tk, 1
 blueperil.de, 1
 bluepostbox.de, 1
 blueprintrealtytn.com, 1
 bluepromocode.com, 1
 bluerange.io, 1
 blueridge.social, 1
-bluerootsmarketing.com, 1
 blues-and-pictures.com, 1
 bluesbarn.tk, 1
 bluesbuyers.com, 1
 bluesecret.co.uk, 1
 blueshouse.ro, 1
 blueskiesmassage.com, 1
 bluesky-it.uk, 1
 blueskybrokerage.tk, 1
@@ -19938,16 +19915,17 @@ bluex.im, 1
 bluex.info, 1
 bluex.net, 1
 bluex.org, 1
 blueyonder.com, 1
 bluffcitytn.gov, 1
 bluffelectrician.co.za, 1
 bluffplumber.co.za, 1
 bluheron.ca, 1
+blui.cf, 0
 blui.xyz, 1
 bluiandaj.ml, 1
 bluicraft.tk, 1
 bluimedia.com, 1
 bluinet.com, 1
 blumando.de, 1
 blumen-garage.de, 1
 blumenfeldart.com, 1
@@ -20106,16 +20084,17 @@ bodybuilding.events, 1
 bodybuildingstyle.tk, 1
 bodybuildingsupplementsexplained.com, 1
 bodybuildingworld.com, 1
 bodygearguide.com, 1
 bodyhealthcare.tk, 1
 bodymassage.cf, 1
 bodymod.tk, 1
 bodymusclejournal.com, 1
+bodypainter.pl, 1
 bodypainting.waw.pl, 1
 bodyshaping.ml, 1
 bodyshopnews.net, 1
 bodytechautomotive.com.au, 1
 bodyweb.com.br, 1
 bodyweightsolution.com, 1
 bodyworksautorebuild.com, 1
 boeah.com, 1
@@ -20438,17 +20417,16 @@ booshka.ga, 1
 boosinflatablegames.co.uk, 1
 boosman.nu, 1
 boosmanpoolservice.com, 1
 boost.fyi, 1
 boost.ink, 1
 boostdesign.tk, 1
 boostgame.win, 1
 boostplm.com, 1
-boostrpro.pl, 1
 booths.cyou, 1
 bootina.com, 1
 bootlesshacker.com, 1
 bootmint.com, 1
 boots-shop.tk, 1
 bootsa.ga, 1
 bootsa.tk, 1
 bootspropertycentral.co.uk, 1
@@ -20669,16 +20647,17 @@ bouncewithbovells.com, 0
 bouncewrightcastles.co.uk, 1
 bouncincastles.co.uk, 1
 bouncing4joy.co.uk, 1
 bouncingbeansinflatables.co.uk, 1
 bouncingbuddiesleicester.co.uk, 1
 bouncingbuzzybees.co.uk, 1
 bouncinghigher.co.uk, 1
 bouncingscotland.com, 1
+bouncourseplanner.net, 1
 bouncy-castles-surrey.co.uk, 1
 bouncy-tots.co.uk, 1
 bouncybaileys.co.uk, 1
 bouncyball.eu, 1
 bouncyballs.org, 1
 bouncybouncyboocastlehire.co.uk, 1
 bouncycastle.net.au, 1
 bouncycastlehire-norwich.com, 1
@@ -21265,23 +21244,23 @@ bricks4kidzelearn.com, 1
 bricksandmotor.co.uk, 1
 brickstreettrio.com, 1
 brickvortex.com, 1
 brickweb.co.uk, 1
 brickwerks.io, 1
 bricmon.tk, 1
 brico-volet.com, 1
 bricolajeux.ch, 0
+bricolea.fr, 1
 bricomag-media.com, 1
 bricomium.com, 1
 brid.gy, 0
 bridal.tk, 1
 bridalfabrics.ru, 1
 bridalweddingshow.ga, 1
-bride-forever.com, 1
 bride.vn, 1
 bridesbouquet.ml, 1
 bridestarco.com, 1
 bridg-it.fr, 1
 bridge-online.cloud, 1
 bridge-to-knowledge.nl, 1
 bridge.nl, 1
 bridgecobuilders.com, 1
@@ -22732,17 +22711,16 @@ bynumlaw.net, 1
 byootify.com, 1
 bypass-link.ga, 1
 bypass.kr, 1
 bypass.sh, 1
 bypassgfw.tk, 1
 bypetula.cz, 1
 byprata.com.br, 1
 byraje.com, 1
-byrddogpaving.com, 1
 byrest.com, 1
 byriderfranchise.com, 1
 byrko.cz, 1
 byrko.sk, 1
 byrnesagency.com, 1
 byronkg.us, 1
 byrtz.de, 1
 byrut.org, 1
@@ -23709,16 +23687,17 @@ capstansecurity.co.uk, 1
 capstansecurity.com, 1
 capsuladigital.tk, 1
 capsule.org, 0
 capsulekitchen.co, 1
 capsulesubs.fr, 1
 capsulezone.tk, 1
 captainark.net, 1
 captainclaw.tk, 1
+captainfit.in, 1
 captainjanks.tk, 1
 captainratnesh.tk, 1
 captainscarlet.tk, 1
 captainsunshine.tk, 1
 captalize.com, 1
 captivationscience.com, 1
 captivationtheory.com, 1
 capturapp.com, 0
@@ -23779,17 +23758,16 @@ carbon-designz.com, 1
 carbon-project.org, 1
 carbon.coop, 1
 carbon12.org, 1
 carbon12.software, 1
 carbonadvantage.tk, 1
 carboneventsupport.be, 1
 carboneventsupport.lu, 1
 carbonholic.org, 1
-carboniaccessori.com.br, 1
 carbonkiller.org, 1
 carbonlib.com, 0
 carbonmonoxidelawyer.net, 1
 carbonnel.me, 1
 carbono.uy, 1
 carbonswap.exchange, 1
 carbontv.com, 1
 carbonvision.cn, 0
@@ -24698,16 +24676,17 @@ cb-crochet.com, 1
 cb1388.com, 1
 cb1588.com, 1
 cbaamaga.com, 1
 cbatcreative.com, 1
 cbc-hire.co.uk, 1
 cbca.gov, 1
 cbcentelles.tk, 1
 cbcf.info, 1
+cbchslax.com, 1
 cbcnet.co.za, 1
 cbcnet.info, 1
 cbd-natural.de, 1
 cbd.casa, 1
 cbd.supply, 1
 cbd181.com, 1
 cbd2050.com, 1
 cbdbflo.com, 1
@@ -24771,17 +24750,16 @@ ccamtech.com, 1
 ccarps.com, 1
 ccatpracticetest.com, 1
 ccattestprep.com, 1
 ccayearbook.com, 1
 ccbin.tk, 1
 ccc-ch.ch, 1
 ccc-checker.cn, 1
 ccc-cloud.de, 1
-ccc.xxx, 1
 cccleaner.tk, 1
 cccp-o.tk, 1
 cccpublishing.com, 1
 cccwien.at, 1
 ccdgaia.pt, 0
 ccdiscussion.com, 1
 ccdlab.ooo, 1
 ccdnederland.org, 1
@@ -24860,16 +24838,17 @@ cdkpatterns.com, 1
 cdkrot.me, 1
 cdlaserena.tk, 1
 cdlinares.tk, 1
 cdmdisinfestazioni.it, 1
 cdmhp.org.nz, 1
 cdmon.tech, 1
 cdn.ampproject.org, 1
 cdn1shweflix.xyz, 1
+cdn6.de, 1
 cdnaval.tk, 1
 cdncompanies.com, 1
 cdnjs.com, 1
 cdnk39.com, 1
 cdns.cloud, 1
 cdnsys.net, 1
 cdnya.com, 1
 cdo.gov, 1
@@ -25020,16 +24999,17 @@ cencalvia.org, 0
 cendata.co.uk, 1
 cendi.gov, 1
 cendis.cz, 1
 cennelley.com, 1
 cennelly.com, 1
 cennetfm.tk, 1
 cennetforum.tk, 1
 censamatil.net, 1
+censeo-financial.com, 1
 censored.ml, 1
 censurfridns.dk, 1
 censurfridns.nu, 1
 censys.io, 1
 centariuss.ga, 1
 centella.tw, 1
 centenariodeuncampeon.tk, 1
 centenera.tk, 1
@@ -25988,17 +25968,17 @@ childswear.tk, 1
 childtaxcredit.gov, 1
 childvisitationassistance.org, 1
 childwelfare.gov, 1
 chiletrenes.tk, 1
 chili.ml, 1
 chilian.de, 1
 chilihosting.eu, 1
 chilikin.pro, 1
-chilimath.com, 1
+chilimath.com, 0
 chilimathwords.com, 1
 chilio.net, 1
 chilipepperhomes.com, 1
 chilipy.ga, 1
 chill-house.ga, 1
 chillebever.nl, 1
 chillipadi.tk, 1
 chilliwackchurchofgod.com, 1
@@ -26478,17 +26458,16 @@ ci-fo.org, 1
 ci-suite.com, 1
 ci5.me, 1
 ciagutek.pl, 1
 ciahalim.tk, 1
 cialde.it, 1
 cialis-trial.gq, 1
 cialisfreetrial.ga, 1
 cialisvtr.com, 1
-cialona.nl, 1
 cialowruchu.pl, 1
 ciancaiphotobooth.com, 1
 ciancode.com, 1
 cianmawhinney.me, 1
 cianmawhinney.xyz, 1
 ciao.ro, 1
 ciaracode.com, 1
 ciaran.tk, 1
@@ -27044,16 +27023,17 @@ claudia-makeup.com, 1
 claudia-urio.com, 0
 claudiahalfter.de, 1
 claudiasnederlandsehangoordwergjes.tk, 1
 claudiaswea.com, 1
 claudiney.eti.br, 1
 claudiney.id, 1
 claudiney.info, 1
 claudiohdz.com, 1
+claumarservice.com, 1
 claus-bahr.de, 1
 claus-cremer.tk, 1
 clauseriksen.net, 1
 clausewitz-gesellschaft.de, 1
 claustrofobia.tk, 1
 clav1d.com, 1
 clavit4.zone, 1
 clawe.de, 1
@@ -27247,17 +27227,16 @@ cliffburton.tk, 1
 clifflu.net, 1
 cliftonheritage.net, 1
 clik.ga, 1
 clik4service.com, 1
 cliksource.com, 1
 climaencusco.com, 1
 climateactionfestival.org, 1
 climatechange2021.org, 1
-climatecrafters.com, 1
 climateinteractive.org, 1
 climatgate.tk, 1
 climaticequipment.tk, 1
 climatizzatore.it, 1
 climatizzatore.roma.it, 1
 climbing.tk, 1
 clinchcountyga.gov, 1
 clindamycin-150mg.ga, 1
@@ -27658,17 +27637,16 @@ cmweller.com, 1
 cn.search.yahoo.com, 0
 cn8522.com, 1
 cna5.net, 1
 cna5.org, 1
 cnabogota.tk, 1
 cnam-idf.fr, 1
 cnaprograms.online, 1
 cnatraining.network, 1
-cnb.ie, 1
 cnbs.ch, 1
 cnc-lehrgang.de, 1
 cncado.net, 1
 cncfraises.fr, 1
 cnclp.org.uk, 1
 cncn3.cn, 1
 cncollege.tk, 1
 cncr.ga, 1
@@ -27697,16 +27675,17 @@ co-founder-stuttgart.de, 1
 co-yutaka.com, 1
 co.fo, 1
 co.lu, 1
 co.search.yahoo.com, 0
 co.td, 1
 co2eco.cn, 0
 co2fr.ee, 0
 co50.com, 1
+coach-immobilier-neuf.fr, 1
 coach.org.uk, 0
 coachapp-ipass.herokuapp.com, 1
 coachbakery.com, 1
 coachezmoi.ch, 0
 coachinfopreneur.com, 1
 coaching-harmonique.fr, 1
 coaching-impulse.ch, 0
 coachingbyelena.com, 1
@@ -28241,17 +28220,16 @@ columbiacountyor.gov, 1
 columbiail.gov, 1
 columbiaproemergencymovers.com, 1
 columbiascaffolding.com, 1
 columbiatwpmi.gov, 1
 columbushydroxide.com, 1
 columbushydroxide.net, 1
 columbushydroxide.org, 1
 columbusks.gov, 1
-columbuswines.com, 1
 colwichks.gov, 1
 colyakoomusic.com, 1
 com-b.vn, 1
 com-news.io, 1
 com.cc, 1
 com.fo, 1
 comactor.com, 1
 comactor.fr, 1
@@ -28769,16 +28747,17 @@ connectingrentalsofbethel.com, 1
 connectionplanet.nl, 1
 connectionstrings.com, 1
 connective.com.au, 1
 connectivehomeloans.com.au, 1
 connectmath.com, 1
 connectme.com.mx, 1
 connectmy.car, 1
 connecto-data.com, 1
+connecto.group, 1
 connectum.eu, 1
 connelink.fr, 1
 conner.work, 1
 conneropticals.ga, 1
 connexas.eu, 1
 connexion.health, 1
 connexionht.com, 1
 connext.de, 1
@@ -29348,17 +29327,16 @@ coshima.gq, 1
 coshima.tk, 1
 cosirex.com, 1
 coskun.tk, 1
 coslinker.com, 1
 cosmasiakraft.tk, 1
 cosmechic.fr, 1
 cosmekaitori.jp, 1
 cosmetic-surgery-prices.co.uk, 1
-cosmeticappraisal.com, 1
 cosmeticasimple.com, 1
 cosmeticenter.com.br, 1
 cosmeticosdelivery.com.br, 1
 cosmeticosnet.com.br, 1
 cosmeticsurgeon.ga, 1
 cosmetify.com, 1
 cosmetiq.tk, 1
 cosmetiquesvegans.com, 1
@@ -29446,16 +29424,17 @@ cougar.dating, 1
 cougarlyon.fr, 1
 coughlan.de, 1
 couleursorgue.tk, 1
 coun.be, 1
 counselingfw.com, 1
 counsellingtime.co.uk, 1
 counsellingtime.com, 1
 counstellor.com, 0
+count.sh, 0
 countdowntrader.com, 1
 counterenlol.com, 1
 counterespionage.com, 1
 countermats.net, 1
 countermentors.com, 1
 countersolutions.co.uk, 1
 counterstrikeonline.org, 1
 countertopapothecary.com, 1
@@ -30474,17 +30453,16 @@ ctnguyen.de, 1
 ctnguyen.net, 1
 ctns.de, 0
 ctoin.tw, 1
 ctonovenkogo.tk, 1
 ctor.ch, 1
 ctoresms.com, 1
 ctpe.info, 1
 ctpe.net, 1
-ctr-sante.eu, 1
 ctr.id, 0
 ctrl.blog, 1
 ctrl.gr, 0
 ctrlcvz.tk, 1
 ctsl.net, 1
 ctstoowoomba.com.au, 1
 ctt.global, 1
 cttso.gov, 1
@@ -31667,31 +31645,31 @@ dannycairns.com, 1
 dannycavanagh.tk, 1
 dannygaidateraelgar.com, 1
 dannyhoekstra.tk, 1
 dannyjota.tk, 1
 dannymoran.com, 1
 dannyoficial.tk, 1
 dannyroh.de, 1
 dannyrohde.de, 1
-dannys.cloud, 0
 dannys.space, 1
 dannyscloud.tk, 1
 dannystevens.co.uk, 1
 dannytemming.tk, 1
 dannyvanwamelen.tk, 1
 dannywall.com.au, 1
 danoji.cf, 1
 danonsecurity.com, 1
 danotage.tv, 1
 danovamix.com.br, 1
 danpiel.net, 1
 danq.me, 1
 danramer.tk, 1
 dansa.com.co, 1
+dansage.co, 0
 dansaunders.me, 1
 dansdiscounttools.com, 1
 dansedesalonsaintave.fr, 1
 danselibre.net, 1
 danselibre.org, 1
 danseressen.nl, 1
 danskefilm.dk, 1
 danskgummi.com, 1
@@ -31797,17 +31775,16 @@ darkfeeling.tk, 1
 darkfilm.tk, 1
 darkfire.ch, 1
 darkfirestudios.tk, 1
 darkforceofhappiness.tk, 1
 darkgames.cf, 1
 darkgrid.eu, 1
 darkhall.tk, 1
 darkhuntersworld.tk, 1
-darkillusion.us, 1
 darkishgreen.com, 1
 darkknights.tk, 1
 darklang.com, 1
 darklaunch.com, 1
 darkleia.com, 1
 darklite.ml, 1
 darkmail.cf, 1
 darkmanthra.tk, 1
@@ -32036,17 +32013,16 @@ datenbitch.org, 0
 datengrab.ws, 1
 datengrab.xyz, 1
 datenkeks.de, 1
 dateno1.com, 1
 datenreiter.cf, 1
 datenreiter.gq, 1
 datenreiter.org, 1
 datensalat.info, 1
-datenschutz-consult.de, 1
 datenschutz-gruenwald.de, 1
 datenschutz-individuell.de, 1
 datenschutz-isny.de, 1
 datenschutz-leutkirch.de, 1
 datenschutz-luebbecke.de, 1
 datenschutz-oberschwaben.de, 1
 datenschutz-ravensburg.de, 1
 datenschutz-recht-medizin.de, 1
@@ -32217,17 +32193,16 @@ davo-usedcars.be, 1
 davogroep.nl, 1
 davorin.cf, 1
 davros.eu, 1
 davros.ru, 1
 davulcuyuz.com, 1
 davy-server.com, 1
 davyatletiek.tk, 1
 davyjones.com.br, 1
-davyjonesatacado.com.br, 1
 davypropper.com, 1
 davys.com.br, 1
 daware.io, 1
 dawgs.ga, 1
 dawidpotocki.com, 1
 dawidwrobel.com, 1
 dawnbringer.eu, 1
 dawnbringer.net, 1
@@ -32619,17 +32594,16 @@ decorarei.com, 1
 decorarmicasa.com, 1
 decoratingadvice.co.uk, 1
 decorations-elmotamaiz.com, 1
 decorativeconcretewa.com.au, 1
 decorativecosmetics.tk, 1
 decorativeflooring.com, 1
 decorator.uk, 1
 decoratore.roma.it, 1
-decorauvent.ca, 1
 decorestilo.com.br, 1
 decorincasa.com.br, 1
 decorlux.bg, 1
 decormiernissanparts.com, 1
 decorno.tk, 1
 decorotti.com.tr, 1
 decorpol-renovation.fr, 1
 decorsolucionesgraficas.es, 1
@@ -33410,17 +33384,16 @@ designville.cz, 1
 designville.sk, 1
 desimpelaere.eu, 1
 desinfectantemanos.org, 1
 desingslash.tk, 1
 desipandora.com, 1
 desiplex.tk, 1
 desire-host.tk, 1
 desish.cf, 1
-desiskinscience.com, 0
 desivideos.tk, 1
 deskaservices.com, 1
 deskdesign.me, 1
 deskdesign.nl, 1
 deskeen.fr, 1
 desklite.gr, 1
 desktopd.eu.org, 0
 desktopfibra.com, 1
@@ -33501,17 +33474,16 @@ detectify.com, 1
 detectivedesk.com.au, 1
 detectro.cc, 1
 deteken.be, 1
 detekenmuze.nl, 1
 detelefoonboer.nl, 1
 detenterprise.com, 1
 determapp.de, 1
 determinatie.tk, 1
-dethemium.com, 1
 deti-online.com, 1
 deti-vse.ml, 1
 deti.ga, 1
 detiklife.com, 1
 detiks.cf, 1
 detishki.ga, 1
 detki.cf, 1
 detki24.ru, 1
@@ -33712,16 +33684,17 @@ dewolden.nl, 0
 dexalo.de, 1
 dexcellentesidees.tk, 1
 dexerto.com, 1
 dexerto.es, 1
 dexerto.fr, 1
 dexign.ro, 1
 dexigner.com, 1
 dexonrest.azurewebsites.net, 1
+dexonservicedeskws.azurewebsites.net, 1
 dexonsoftware.com, 0
 dexterseries.ru, 1
 dextra.tk, 1
 deyanadeco.com, 1
 deyute.com, 1
 dez-online.de, 1
 dezea.net, 1
 dezeregio.nl, 1
@@ -33997,17 +33970,16 @@ didi-online.tk, 1
 dididiamond.net, 1
 didier-equipereussite.com, 1
 didierfle-decibel.fr, 1
 didierfle-latelier.fr, 1
 didierfle.com, 1
 didierghez.com, 1
 didierlaumen.be, 1
 didigotoffer.com, 1
-didntdoitbailbonds.com, 1
 didtrumpopengovernmentyet.com, 1
 die-bergfuehrer.de, 1
 die-besten-weisheiten.de, 1
 die-blahuts.de, 1
 die-borts.ch, 1
 die-gruenen-teufel.de, 1
 die-machons.de, 1
 die-partei-reutlingen.de, 1
@@ -34273,16 +34245,17 @@ digitalninja.tk, 1
 digitalnomadsunderground.com, 1
 digitalnook.net, 1
 digitalphone.tk, 1
 digitalphoto.group, 1
 digitalphoto.tech, 1
 digitalpiloten.org, 1
 digitalplaymakers.co.uk, 1
 digitalpocketpedometer.tk, 1
+digitalponsel.com, 0
 digitalposition.com, 1
 digitalprimate.my, 1
 digitalprofilers.com, 1
 digitalradio.ie, 1
 digitalrealitybbs.com, 1
 digitalreborn.com, 1
 digitalredshirts.com, 1
 digitalrights.center, 1
@@ -34292,17 +34265,16 @@ digitalsearchlab.com, 1
 digitalservices.lk, 1
 digitalside.com.br, 1
 digitalsignagedisplay.com, 1
 digitalsignageweb.com, 1
 digitalskillswap.com, 1
 digitalsphere.tk, 1
 digitalsurge.io, 1
 digitaltcertifikat.dk, 1
-digitaltepee.co.uk, 1
 digitaltry.tk, 1
 digitalupcoming.tk, 1
 digitalvag.tk, 1
 digitalwasteland.net, 0
 digitec.ch, 1
 digitecgalaxus.ch, 1
 digitise.io, 1
 digitium.fr, 1
@@ -35263,17 +35235,17 @@ dnvod.ml, 1
 dnzz123.com, 0
 do-do.tk, 1
 do-it-service.de, 1
 do-prod.com, 0
 do.search.yahoo.com, 0
 do13.net, 1
 do67.de, 1
 do67.net, 1
-doamatto.xyz, 0
+doamatto.xyz, 1
 doanhai.tk, 1
 dobavki.club, 1
 dobbshvac.com, 1
 dobledemichaeljackson.tk, 1
 dobleseo.pro, 1
 dobob.kr, 1
 dobookmark.ml, 1
 dobraimprezka.pl, 1
@@ -36702,17 +36674,16 @@ druzya.store, 1
 drvaidyas.com, 0
 drwang.group, 0
 drweissbrot.net, 1
 dry-cleaning.tk, 1
 dryashplasticsurgery.com, 1
 dryasinakgul.com, 1
 drybjed.net, 1
 drybysuperior.com, 1
-drycleancoalition.org, 1
 drycreekphoto.com, 1
 drydensfairfax.com, 1
 drydor.com, 1
 drydrydry.com, 1
 dryerrepairaustin.com, 1
 dryerventcleaningarlington.com, 1
 dryerventcleaningcarrollton.com, 1
 dryip.com, 1
@@ -36954,16 +36925,17 @@ duloxetine.gq, 1
 dulse.fr, 1
 dum.moe, 1
 dum.tw, 1
 dumax.fr, 1
 dumb-laws.net.ru, 1
 dumbeartech.com, 1
 dumberger-bau.de, 1
 dumbfunded.co.uk, 1
+dumbsolpunks.com, 1
 dumino.bg, 1
 dummo.tk, 1
 dumnezeu.tk, 1
 dumping.tk, 1
 dumpper.ch, 1
 dumpper.com, 1
 dumspiro.ch, 1
 duna.com.co, 1
@@ -37824,16 +37796,17 @@ eaglemoe.com, 1
 eaglenation.net, 1
 eagleridgecampground.com, 1
 eaglerockseattle.com, 1
 eagletechz.com.br, 1
 eaglewreck.info, 1
 eaglexiang.org, 1
 eagleyecs.com, 1
 eaimty.com, 1
+eajglobal.com, 1
 ealadel.com, 1
 ealekseyev.ml, 1
 ealev.de, 1
 eames-clayton.us, 1
 eamigo.com, 1
 eamproperties.com, 1
 eandata.com, 1
 eanraig.top, 1
@@ -37850,17 +37823,16 @@ earfolds.com, 1
 earli.com, 1
 earlsttech.ca, 1
 earlybetter.com, 1
 earlyvoting.cf, 1
 earlyvoting.gq, 1
 earlyvoting.ml, 1
 earlyyearshub.com, 1
 earmarks.gov, 1
-earn99.co, 1
 earnet.tk, 1
 earningsgames.tk, 1
 earningthatis.tk, 1
 earth-people.org, 1
 earth-quake.tk, 1
 earthbound.tk, 1
 earthbox.com, 1
 earthcorporation.cf, 1
@@ -37900,17 +37872,16 @@ eastportcorp.tk, 1
 eastprovidenceri.gov, 1
 eastshare.ml, 1
 eastside.tk, 1
 eastsidecottages.co.uk, 1
 eastsideroofingcontractor.com, 1
 eaststudios.net, 1
 eastvalleyautorebuild.com, 1
 eastwashingtonpa.gov, 1
-eastwesttmc.com.au, 1
 eastwindsorhistory.tk, 1
 eastyorkshirebuses.co.uk, 1
 easukasbestos.co.uk, 1
 easy-affiliations.tk, 1
 easy-company.tk, 1
 easy-design.tk, 1
 easy-factures.fr, 1
 easy-katka.ga, 1
@@ -38092,16 +38063,17 @@ ebookspy.tk, 1
 ebooktoan.com, 1
 ebookweb.gq, 1
 ebop.ch, 1
 eboxgroup.tk, 1
 eboxtenders.com, 1
 ebpgateway.com, 1
 ebrahimhadimarket.com, 1
 ebrdbusinessguide.com, 1
+ebrea.ch, 1
 ebregrow.com, 1
 ebrnd.de, 1
 ebrowz.com, 1
 ebru-gundes.tk, 1
 ebrununkasnagi.com, 1
 ebuha.ga, 1
 ebuku.tk, 1
 eburg.ml, 1
@@ -38270,17 +38242,16 @@ economyroofingco.com, 1
 econsorzio.com, 1
 econstitution.bg, 1
 econsumer.gov, 1
 ecoon.net, 1
 ecopak.org, 1
 ecopark.asia, 1
 ecorak.de, 1
 ecorp-australia.tk, 1
-ecos-eguilles.com, 1
 ecos-ev.de, 1
 ecos.srl, 1
 ecosas.org, 1
 ecosdesociedad.tk, 1
 ecosfti.tk, 1
 ecoshare.info, 1
 ecosial.org, 1
 ecosistema.ai, 1
@@ -38354,17 +38325,16 @@ eddsworld.tk, 1
 eddyn.net, 0
 eddysystem.tk, 1
 eddyworld.tk, 1
 edeals.co, 1
 edeals.co.com, 1
 edeals.com.co, 1
 edeca.net, 1
 ededdeddy.tk, 1
-edefrutos.me, 1
 edefrutos2020.com, 1
 edegembicycleclub.tk, 1
 edegulkoyu.tk, 1
 edehsa.com, 1
 edel-suff.de, 1
 edelveiys.tk, 1
 edelweiskapel.tk, 1
 edelweiss-pinzolo.com, 1
@@ -38445,17 +38415,16 @@ edok.com.br, 1
 edoss.co.za, 0
 edplan.io, 1
 edr-d.expert, 1
 edragneainpuscarie.ro, 1
 edrepay.com, 1
 edrgroup.nl, 1
 edrosd.cf, 1
 edrost.tk, 1
-edsby.com, 1
 edscolors.com, 1
 edshogg.co.uk, 1
 edsm.net, 1
 edstem.org, 1
 edstep.com, 1
 edtech-hub.com, 1
 edtech.ee, 1
 edtechwebb.com, 1
@@ -38718,16 +38687,17 @@ eggendorfer.tv, 1
 eggendorfer.uk, 1
 eggendorfer.us, 1
 eggendorfer.wine, 1
 eggert.org, 1
 egglestonyouthcenter.org, 1
 eggman.tk, 1
 eggqvq.com, 1
 eggrolls.ml, 1
+eggy.com.au, 0
 eggzr.com, 1
 egh.ir, 1
 egiftcards.be, 1
 egilopaseryh.tk, 1
 egipet-tiz.tk, 1
 egiptwakacje.tk, 1
 egittophilia.tk, 1
 egles.eu, 1
@@ -39073,16 +39043,17 @@ electrical-schools.com, 1
 electricalagoura.com, 1
 electricalagourahills.com, 1
 electricalandelectronicsengineerinformation.ga, 1
 electricalcalabasas.com, 1
 electricalcamarillo.com, 1
 electricalconejovalley.com, 1
 electricaldosvientos.com, 1
 electricalengineers.tk, 1
+electricalfencingfourways.co.za, 1
 electricalfencinggermiston.co.za, 1
 electricalhiddenhills.com, 1
 electricallakesherwood.com, 1
 electricalmalibu.com, 1
 electricalmoorpark.com, 1
 electricalnewburypark.com, 1
 electricaloakpark.com, 1
 electricalpacificpalisades.com, 1
@@ -39092,17 +39063,16 @@ electricalwestlakevillage.com, 1
 electricannihilation.tk, 1
 electricbeast.co, 1
 electriccalabasas.com, 1
 electriccamarillo.com, 1
 electriccitysf.com, 1
 electricconejovalley.com, 1
 electricdosvientos.com, 1
 electricdreams.xyz, 1
-electricfencebenoni.co.za, 1
 electricfenceboksburg.co.za, 1
 electricfencemidrand.co.za, 1
 electricfenceroodepoort.co.za, 1
 electricfencesouthafrica.com, 1
 electricfireplaces.tk, 1
 electricgatemotorsalberton.co.za, 1
 electricgatemotorskemptonpark.co.za, 1
 electricgatemotorsroodepoort.co.za, 1
@@ -39578,17 +39548,16 @@ elsenzhafen.de, 1
 elsg.co.uk, 1
 elshou.com, 1
 elshrif.com, 1
 elsignificadodesonar.com, 1
 elskling.no, 1
 elstopstelten.nl, 0
 elsuccionador.com, 1
 elsvanderlugt.nl, 1
-elswickllc.com, 1
 elsword.moe, 0
 elta.com.ua, 1
 eltair.com, 1
 eltar.pl, 1
 eltconsultants.com.mx, 1
 eltd.com.vn, 1
 eltern-verein.ch, 1
 elternforum-birmensdorf.ch, 1
@@ -39999,16 +39968,17 @@ endbegins.tk, 1
 endbox.email, 1
 ende-x.com, 1
 endeal.nl, 1
 endee.de, 1
 ender.co.at, 1
 ender.fr, 1
 ender.moe, 1
 ender3.info, 1
+enderandrew.com, 1
 enderbycamping.com, 1
 enderdrachelp.ddns.net, 1
 enderhost.tk, 1
 enderle.cloud, 1
 enderman.eu, 1
 enderszone.com, 0
 endgame-economics.com, 1
 endiana.cf, 1
@@ -40543,17 +40513,16 @@ epsi.io, 1
 epsilon.dk, 1
 epsmil.it, 1
 epspolymer.com, 1
 eptreviewer.com, 1
 epublibre.org, 1
 epvd.tk, 1
 epyonsuniverse.net, 1
 eq-serve.com, 1
-eqab.net, 1
 eqassociates.com, 1
 eqibank.com, 1
 eqlplayground.io, 1
 equabanking.cz, 1
 equalcloud.com, 1
 equalone.co.jp, 1
 equasea.com, 0
 equate.net.au, 1
@@ -40819,16 +40788,17 @@ es-tools.de, 1
 es-trade.biz, 1
 es-vps.eu, 1
 es.ax, 1
 es.search.yahoo.com, 0
 es8888.net, 1
 es888999.com, 1
 es999.net, 1
 esaborit.ddns.net, 0
+esadoggy.com, 0
 esagente.com, 1
 esajokinen.net, 1
 esale.co, 1
 esalesclub.com, 1
 esamievalori.com, 1
 esamsur.tk, 1
 esarp.com, 1
 esarreglocomercial.com, 0
@@ -41180,16 +41150,17 @@ estudantetorcedor.com.br, 1
 estudarfora.org.br, 1
 estudiaenrusia.com, 1
 estudiarauxiliardefarmacia.com, 1
 estudiarcoachingdeportivo.es, 1
 estudiarcocinaonline.es, 1
 estudiarenergiasrenovablesonline.es, 1
 estudiaresteticaonline.es, 1
 estudiarparaser.com, 1
+estudiarseguridadprivada.es, 1
 estudiaryaprenderingles.com, 1
 estudiemosvirtualmente.com, 1
 estudio21pattern.com, 0
 estudioaguiar.com.br, 1
 estudiogarcia-rada.com, 1
 estudiomantis.tk, 1
 estudios-biblicos.tk, 1
 estudiosalmogavares.tk, 1
@@ -41220,17 +41191,16 @@ etajerka.spb.ru, 1
 etaldelune.fr, 1
 etalent.net, 1
 etalktome.com, 1
 etanol.tk, 1
 etaoinwu.com, 1
 etaoinwu.win, 1
 etath.com, 1
 etaxigraz.com, 1
-etbtoursegypt.com, 1
 etccooperative.org, 0
 etch.co, 1
 etch44.com, 1
 etcivil.com, 1
 etctop.tk, 1
 etdonline.co.za, 1
 etdp.co.za, 1
 etdpractices.co.za, 1
@@ -41322,17 +41292,16 @@ etikus-hacker.hu, 1
 etimmer.nl, 1
 etincelle.ml, 1
 etincelle.tk, 1
 etindustries.com, 1
 etiqa.tk, 1
 etiquetaunica.com.br, 1
 etkaddict.com, 1
 etkarle.de, 1
-etkinpatent.com, 1
 etnis.id, 1
 etnoforum.tk, 1
 etnoria.com, 1
 etny.nl, 1
 etoile-rc.jp, 1
 etoile-usedcars.com, 1
 etopia.ir, 1
 etoro-openbook.tk, 1
@@ -41522,16 +41491,17 @@ eurotramp.com, 0
 eurousa.us, 1
 eurovision-romania.tk, 1
 eurovision.ie, 1
 eurseo.com, 1
 euruni.edu, 1
 eusarse.tk, 1
 euskaltzaleak.tk, 1
 eusou.ml, 1
+euterpiaradio.ch, 1
 eutiximo.com, 1
 eutotal.com, 1
 euvo.tk, 0
 euwid-energie.de, 1
 euwid.de, 1
 euzissima.com.br, 1
 ev-menden-meindorf.de, 1
 ev-menden.de, 1
@@ -41612,17 +41582,17 @@ evenfall.tk, 1
 evenimenteromania.tk, 1
 eveningstar.tk, 1
 eveningtaxservices.com, 1
 evenstar-gaming.com, 1
 evenstargames.com, 1
 event-blick.de, 1
 event-fullyyours.com, 1
 event-reisen.tk, 1
-event1teamstore.com, 1
+event1teamstore.com, 0
 event4fun.no, 1
 eventact.com, 0
 eventaro.com, 1
 eventblog2017.tk, 1
 eventcore.tk, 1
 eventdays.tk, 1
 eventerlebnis.ch, 1
 eventfun.tk, 1
@@ -42135,17 +42105,16 @@ expresvpn-private-analytics.net, 1
 exprimo.tk, 1
 expromo.eu, 1
 expxkcd.com, 1
 exquisique.tk, 1
 exquisito.tk, 1
 exs.lv, 1
 exsanio.de, 1
 exside.com, 1
-extact.com, 1
 extantsoft.biz, 1
 extendet.tk, 1
 extendwings.com, 1
 extensia.it, 1
 extensibility.biz.tr, 1
 extensiblewebmanifesto.org, 1
 extensiblewebreportcard.org, 1
 extensiblewebsummit.org, 1
@@ -42759,17 +42728,17 @@ fakes-ru.tk, 1
 fakhrudin.tk, 1
 fakinga.tk, 1
 fakt.io, 1
 fakt.tk, 1
 faktenfaktenfakten.tk, 1
 faktotum.tech, 0
 fakturar.com, 1
 fakturi.com, 1
-faktury.co, 1
+faktury.co, 0
 falaeapp.org, 1
 falaowang.com, 1
 falasteenjobs.com, 1
 falbros.com, 1
 falce.in, 1
 falcema.com, 1
 falchion.tk, 1
 falcibiosystems.org, 1
@@ -43323,16 +43292,17 @@ fbcopy.com, 1
 fbctx.gov, 1
 fbe.to, 1
 fbf.gov, 1
 fbfwd.email, 1
 fbi.gov, 1
 fbigame.com, 1
 fbihr.gov, 1
 fbiic.gov, 1
+fbijobs.gov, 1
 fbo.gov, 1
 fbo.network, 1
 fboerman.nl, 1
 fbrief.org, 1
 fbsbx.com, 1
 fbthirdpartypixel.com, 1
 fbtholdings.com, 1
 fburl.com, 1
@@ -43345,17 +43315,16 @@ fcapartsdb.com, 1
 fcapollo.tk, 1
 fcarrascosa.es, 1
 fcarsenal.tk, 1
 fcbarcelona.cz, 1
 fcblueboys.be, 1
 fcbrasov.tk, 1
 fcburk.de, 1
 fccarbon.com, 0
-fccpvirtual.com.ve, 1
 fcdauwendaele-dames.tk, 1
 fcdekampioenen.tk, 1
 fcdemuis.tk, 1
 fcdenhaag-holi.tk, 1
 fcdordrecht.tk, 1
 fcforum.net, 1
 fcg.fyi, 1
 fcgmd.gov, 1
@@ -43388,17 +43357,16 @@ fdms.gov, 1
 fdn.one, 1
 fdnsc.net, 1
 fdp-alsdorf.de, 1
 fdp-heinsberg.de, 1
 fdpbrig.ch, 1
 fdresearch.ca, 1
 fdsl.eu, 1
 fe-data.nl, 1
-feac.us, 1
 feaden.me, 1
 feandc.com, 1
 fear-crowd.tk, 1
 fearedcreation.tk, 1
 fearfactory.tk, 1
 fearghus.org, 1
 fearlessmusic.tk, 1
 fearstyle.tk, 1
@@ -44865,17 +44833,16 @@ flipin.ga, 1
 flipmusic.tk, 1
 flipneus.net, 1
 flipos.be, 0
 flipphotography.ga, 1
 flipping.land, 0
 flipsidevr.com, 1
 fliptable.org, 1
 flipthebrain.com, 1
-fliptracker.io, 1
 flipweb.tk, 1
 flirt-norden.de, 1
 flirtbox.tk, 1
 flirtee.net, 1
 flirtfaces.de, 1
 flirtitup.com, 1
 flirtlu.com, 1
 flirtlu.net, 0
@@ -45645,28 +45612,30 @@ formsbyair.com, 1
 formsmarts.com, 1
 formsmarts.net, 1
 formula-ot.ru, 1
 formula.cf, 1
 formulacionquimica.com, 1
 formulastudent.de, 1
 formulaveevictoria.com.au, 1
 formup.com.pl, 1
+formvibes.com, 1
 fornarisandres.com, 1
 foro-coopfuture.tk, 1
 foro.io, 0
 foro.red, 1
 foroaranda.com, 1
 forobachiller.com, 1
 forocachacero.tk, 1
 forocbmollet.tk, 1
 forocio.tk, 1
 forocoches.com, 1
 forocristiano.tk, 1
 forodebanfield.tk, 1
+forodeespanol.com, 1
 forodieta.com, 0
 foroenguera.tk, 1
 forojovensanfernando.tk, 1
 forokd.com, 1
 forologikidilosi.com.gr, 1
 foromasters.tk, 1
 foropl.com, 1
 forosdelmisterio.tk, 1
@@ -46012,16 +45981,17 @@ fragments.ga, 1
 fragmentspuren.de, 1
 fragmentus.tk, 1
 fragnation.tk, 1
 fragstore.net, 1
 fragzona.tk, 1
 fraho.eu, 1
 frahub.com, 1
 frail.gq, 1
+fralef.me, 0
 fralippolippi.tk, 1
 frama.link, 1
 frama.site, 1
 frama.wiki, 1
 framabag.org, 1
 framabee.org, 1
 framabin.org, 1
 framablog.org, 1
@@ -46509,16 +46479,17 @@ freewoodfactory.com, 1
 freexmovie.com, 1
 freexxxmovies.biz, 1
 freeyourmusic.com, 1
 freeza.cf, 1
 freeza.tk, 1
 freezander.tk, 1
 freezemea.com, 1
 freezerrepairaustin.com, 1
+freezvon.com, 1
 frei.social, 1
 freibesetzt.tk, 1
 freiboth.ddns.net, 1
 freie-software.net, 1
 freifahrt.de, 1
 freifall.tk, 1
 freifunk-burgaltendorf.de, 1
 freifunk-duesseldorf.de, 1
@@ -47379,16 +47350,17 @@ fyllehack.se, 1
 fylm.ai, 1
 fyn.nl, 1
 fyn.software, 1
 fynbo.io, 1
 fynchmobility.com, 1
 fyol.pw, 1
 fyp-aiman.com, 1
 fyphb.com, 1
+fyrehost.net, 1
 fyrehost.xyz, 1
 fyretrine.com, 1
 fyroeo.fr, 0
 fysio-ict.nl, 1
 fysiotherapie-ict.nl, 1
 fysiotherapie.tk, 1
 fysiotherapieapeldoornzuid.nl, 1
 fysiotherapiesimons.nl, 1
@@ -47465,17 +47437,16 @@ gabbeh.jp, 1
 gabby-online.tk, 1
 gabbyer.ga, 1
 gabbyer.gq, 1
 gabbyer.ml, 1
 gabe.cooking, 1
 gabe.download, 1
 gabe.house, 1
 gabe.link, 1
-gabe.pics, 1
 gabe.space, 1
 gabe.watch, 1
 gabe565.com, 1
 gabeb1920.com, 1
 gabecook.com, 1
 gabethebabetv.com, 1
 gabigold.net, 1
 gabijazava.com, 1
@@ -47857,17 +47828,16 @@ gamesplanet.com, 1
 gamesplanet.tk, 1
 gamesputnik.ru, 1
 gamester.tv, 1
 gamestoplayfree.com, 1
 gameswitchers.uk, 1
 gametium.com, 1
 gametium.es, 1
 gametowndev.tk, 1
-gametriot.com, 1
 gametube.website, 1
 gameview.tk, 1
 gamewayz.online, 1
 gamewinninggoal.com, 1
 gameworldcdr.tk, 1
 gamexperts.ga, 1
 gamezo.co.uk, 1
 gamezon.ga, 1
@@ -47914,17 +47884,16 @@ ganaderosdeceres.com.ar, 1
 ganapati.fr, 1
 ganardinerillo.tk, 1
 ganardineroporinternett.com, 1
 ganasoku.net, 1
 gancedo.com.es, 1
 gandalfcz.tk, 1
 gandalfservice.com, 1
 gandalfthefeline.com, 1
-gandgliquors.com, 1
 gandul.ro, 1
 gangbangs.tk, 1
 gangbangteen.net, 1
 ganggalbichler.at, 1
 ganglioslinfaticos.com, 1
 gangnam-club.com, 1
 gangnamcool.com, 1
 gangrulz.tk, 1
@@ -49178,17 +49147,16 @@ gialupa.tk, 1
 giancarlomarino.com, 1
 giangma.tk, 1
 giannademartini.com, 1
 giannifoti.it, 1
 giannoug.gr, 1
 gianproperties.com, 1
 giant-panda.com, 1
 giant-tortoise.com, 1
-giantbrandsolutions.com, 1
 giantratesers.ga, 1
 giantratesest.ga, 1
 giantslipandslide.co.uk, 1
 giantsquid.cf, 1
 giantsquid.ga, 1
 giantsquid.gq, 1
 giantsquid.tk, 1
 gianttree.de, 1
@@ -49267,16 +49235,17 @@ gigashopz.com, 1
 gigasoft.tk, 1
 gigatags.tk, 1
 gigatop.ga, 1
 gigatron.tk, 1
 gigawa.lt, 1
 gigawattz.com, 1
 giggletotz.co.uk, 1
 gigharborwa.gov, 1
+gigiena-ruk.ru, 1
 gigiscloud.servebeer.com, 1
 giglink.club, 1
 gigloog.tk, 1
 gigpam.com, 1
 gigseekr.com, 1
 gijonshiro.tk, 1
 gikovatelojavirtual.com.br, 1
 gil.re, 1
@@ -49429,16 +49398,17 @@ gitlab-apps.com, 1
 gitns.com, 1
 gitns.dev, 1
 gitns.io, 1
 gitns.net, 1
 gitns.nl, 1
 gitns.org, 1
 gitstuff.tk, 1
 gittigidiyor.com, 1
+gittr.ch, 1
 giuem.com, 1
 giuliabonati.com, 1
 giuliawylde.com, 1
 giulliamodas.com.br, 1
 giunchi.net, 1
 giuristifriburgo.ch, 1
 giuseppemacario.it, 1
 giuseppemacario.men, 1
@@ -49820,17 +49790,16 @@ gmind.ovh, 1
 gml4d2.ml, 1
 gmod.de, 1
 gmpark.dk, 1
 gmpartsdb.com, 1
 gmpartsgiant.com, 1
 gmpartsprime.com, 1
 gmslparking.co.uk, 1
 gmsociety.tk, 1
-gmsurveyingms.com, 1
 gmta.nl, 1
 gmtplus.co.za, 1
 gmuh.fr, 1
 gmw-hannover.de, 1
 gmw-ingenieurbuero.de, 1
 gmx.at, 1
 gmx.ch, 1
 gmx.co.uk, 1
@@ -50717,17 +50686,16 @@ grapheneos.info, 1
 grapheneos.net, 1
 grapheneos.org, 1
 grapheneos.ovh, 1
 graphic-schools.com, 1
 graphic-shot.com, 1
 graphicbuffet.co.th, 1
 graphicdesignresources.net, 1
 graphicdream.tk, 1
-graphicnab.com, 1
 graphicspace.tk, 1
 graphicwallet.com, 1
 graphire.io, 1
 graphiste-freelance-rouen.fr, 1
 graphite.org.uk, 1
 graphobyte.com, 1
 grapholio.net, 1
 graphotism.com, 1
@@ -50770,17 +50738,16 @@ gratismuziek.tk, 1
 gratisonlinespel.tk, 1
 gratisparati.tk, 1
 gratitudeabundancepassion.com, 1
 gratius.tk, 1
 gratiz.nl, 1
 grattan.co.uk, 1
 gratuitweb.tk, 1
 graumeier.de, 1
-grauwasser-blog.de, 1
 gravedigger.tk, 1
 gravelshooters.com, 1
 gravelshooters.net, 1
 gravelshooters.org, 1
 gravely.com, 1
 gravensteengent.be, 1
 graver-art.ru, 1
 gravescountyky.gov, 1
@@ -52109,17 +52076,16 @@ hairextensionsuk.tk, 1
 hairfitwolvega.nl, 1
 hairgrowth.cf, 1
 hairgrowth.gq, 1
 hairgrowth.ml, 1
 hairhardstyle.tk, 1
 hairhumanextensions.tk, 1
 hairloss.com, 1
 hairlossadvice.tk, 1
-hairmitage.pl, 0
 hairphoto.tk, 1
 hairpins.tk, 1
 hairsalon-wish.com, 1
 hairstyles-salon.tk, 1
 haitaka.cc, 1
 haitang.com, 1
 haititransfert.com, 1
 haitou.tk, 1
@@ -52303,17 +52269,16 @@ handlekrypto.com, 1
 handlingcosters.ga, 1
 handlingcostest.ga, 1
 handmade-club.tk, 1
 handmade-workshop.de, 1
 handmadebuy.ru, 1
 handmadehechoamano.com, 1
 handmadetutorials.ro, 1
 handphones.tk, 1
-handrollschile.cl, 1
 handsaccounting.com, 1
 handsomeabel.tk, 1
 handstandstudio.ga, 1
 handwerk-digital-steinfurt.de, 1
 handwerkwebseiten.de, 0
 handy-page.tk, 1
 handy.lc, 1
 handyglas.com, 1
@@ -52608,16 +52573,17 @@ harpoo.jp, 0
 harpoonlarsen.tk, 1
 harrachovskyapartman.cz, 1
 harray.tk, 1
 harrcostl.com, 1
 harriedrecords.tk, 1
 harrietjohnston.tk, 1
 harrimantn.gov, 1
 harringtonca.com, 1
+harrisandharris.com.au, 1
 harrisconsulting.ie, 1
 harrisexteriors.com, 1
 harrisonar.gov, 1
 harrisonassessments.asia, 1
 harrisonassessments.co.id, 1
 harrisonassessments.co.in, 1
 harrisonassessments.co.uk, 1
 harrisonassessments.com, 1
@@ -53125,17 +53091,16 @@ healthguerrilla.ga, 1
 healthhard.ga, 1
 healthharrisburg.tk, 1
 healthhelena.tk, 1
 healthhendersonville.tk, 1
 healthhuntsville.tk, 1
 healthhusky.ga, 1
 healthiercompany.com, 1
 healthiergenerations.co.uk, 1
-healthierweight.co.uk, 1
 healthimagine.ga, 1
 healthintergrity.ga, 1
 healthiraq.ga, 1
 healthiron.ga, 1
 healthit.gov, 1
 healthjackpot.ga, 1
 healthjarrettsville.tk, 1
 healthjoker.ga, 1
@@ -53454,16 +53419,17 @@ heibel.tk, 1
 heic.nz, 1
 heid.ws, 1
 heidarilawgroup.com, 1
 heidegg.ch, 1
 heiden-wir-helfen.de, 1
 heidifuller.com, 1
 heidihills.com, 1
 heidirange.tk, 1
+heidisheroes.org, 1
 heidns.cn, 0
 heightselectrical.com.au, 1
 heijdel.nl, 1
 heijenoord.net, 1
 heijmans.blog, 1
 heijmans.email, 1
 heijmans.io, 1
 heijmans.org, 1
@@ -53511,16 +53477,17 @@ hekate.com.mx, 1
 hekeki.com, 1
 hekimim.tk, 1
 hekoro.ml, 1
 hektenkairez.com, 1
 hekwerken.tk, 1
 heladospipos.ga, 1
 helagotaland.ga, 1
 helagotaland.gq, 1
+helali.me, 1
 helastel.com, 1
 helbreath.tk, 1
 helco.xyz, 1
 helden-spielen.de, 1
 heldenhalde.de, 1
 helder.tk, 1
 helderneves.pt, 1
 heldtech.services, 1
@@ -53958,18 +53925,19 @@ hexobind.com, 1
 hexony.com, 1
 hexr.org, 1
 hexsafe.io, 1
 hexstream.net, 1
 hexstream.xyz, 1
 hexstreamsoft.com, 1
 hexxagon.com, 1
 hey.pw, 1
-heyapakabar.com, 0
+heyapakabar.com, 1
 heybaker.com.au, 1
+heyboldface.com, 1
 heybookmark.ga, 1
 heybookmark.gq, 1
 heybritney.tk, 1
 heybyrdie.com, 1
 heycrab.xyz, 1
 heydorff.duckdns.org, 1
 heyfringe.com, 1
 heyghost.io, 1
@@ -56105,26 +56073,24 @@ hurbascooter.com, 1
 hurd.is, 1
 hurinkazan2020.com, 1
 hurleyhomestead.com, 1
 huron.tk, 1
 hurricanecarroll.com, 1
 hurricanelabs.com, 0
 hurricaneplaneers.ga, 1
 hurricaneplaneest.ga, 1
-hurrikane.us, 1
 hurriyetseriilan.tk, 1
 hurstiharrell.tk, 1
 hurtigtinternet.dk, 1
 hus.gay, 1
 husakbau.at, 1
 hushbabysleep.com, 1
 hushfile.it, 1
 husic.net, 0
-husk.house, 1
 husky-in-nood.tk, 1
 huskyeye.de, 1
 huskyinc.us, 0
 husmann.tech, 1
 husqvarnamoped.se, 1
 hussam.eu.org, 1
 hustl.nl, 1
 hustle.com, 1
@@ -56662,17 +56628,16 @@ icoh.it, 1
 icojapan.tokyo, 1
 icollezionisti.com, 1
 icolorpalette.com, 1
 icon-art.nl, 1
 icon-programming.tk, 1
 iconecoiffure.ca, 1
 iconintegration.com.au, 1
 iconoarte.tk, 1
-iconomi.net, 1
 icons4free.tk, 1
 iconsuppstore.com, 1
 iconworld.ml, 1
 iconx.ml, 1
 iconz.tk, 1
 icosnet.com.dz, 1
 icountnm.gov, 1
 icowhitepapers.co, 1
@@ -56680,16 +56645,17 @@ icpc.pp.ua, 1
 icpc2016.in.th, 1
 icq-project.net, 1
 icq-world.tk, 1
 icruise.com, 1
 ics.edu.hn, 1
 icst.tk, 1
 ict-concept.nl, 1
 ict-crew.nl, 1
+ict-kerk.nl, 1
 ict-oldehove.nl, 1
 ict-radar.com, 1
 ict-radar.nl, 1
 ict.govt.nz, 1
 ictbaneninnederland.nl, 1
 ictbiz.com.au, 1
 ictcareer.ch, 1
 ictinforensics.org, 1
@@ -56845,16 +56811,17 @@ idol-bikes.ru, 1
 idolf.dk, 1
 idolfap.com, 1
 idolish7.fun, 0
 idoljp.com, 1
 idontexist.me, 0
 idonthaveawebsite.tk, 1
 idontplaydarts.com, 1
 idoparadoxon.hu, 1
+idowp.net, 1
 idp.onl, 1
 idraetsmusik.dk, 1
 idratherbequilting.com, 1
 idraulico-roma.it, 1
 idraulico.roma.it, 1
 idrissi.eu, 1
 idsafe.co.za, 1
 idstudio.tk, 1
@@ -57436,17 +57403,16 @@ imerit.net, 1
 imerys-mineraux-decoratifs.com, 1
 imesh-light.tk, 1
 imex-dtp.com, 1
 imexmed.com.gt, 1
 imfacademy.com, 1
 imforza.com, 1
 img.mg, 1
 img.ovh, 1
-imgaa.com, 1
 imgbb.com, 1
 imgbu.com, 1
 imgencrypt.com, 1
 imgg.es, 1
 imgo.ga, 1
 imgo.tk, 1
 imgup.co, 1
 imguploaden.nl, 1
@@ -57928,16 +57894,17 @@ inethost.eu, 1
 inetpub.cn, 1
 inetserver.eu, 1
 inetsoftware.de, 1
 inetuser.tk, 1
 inevitavelbrasil.com.br, 1
 inex.one, 1
 inexlog.fr, 1
 inexpensivecomputers.net, 1
+inextmovies.link, 1
 ineztheminiatureelephant.com, 1
 inf-fusion.ca, 1
 inf0sec.nl, 1
 infalaw.com, 1
 infamousguild.tk, 1
 infans.be, 1
 infantry.org.ua, 1
 infcloud.com, 1
@@ -58714,16 +58681,17 @@ intelhost.cl, 1
 intelhost.com, 1
 intelhost.com.ar, 1
 intelhost.com.br, 1
 intelhost.com.co, 1
 intelhost.com.mx, 1
 intelhost.com.pe, 1
 intelhost.net, 1
 inteli.com.pl, 1
+intelics.com.au, 1
 intellar.com, 1
 intelldynamics.com, 1
 intellecta.is, 1
 intellektuaalomand.ee, 1
 intelliance.eu, 1
 intelligence-explosion.com, 1
 intelligenetics.com, 0
 intelligentcontacts.com, 1
@@ -59561,16 +59529,17 @@ ishet.al, 1
 ishhaara.in, 1
 ishigurodo.com, 1
 ishiharaken.com, 1
 ishii.blog, 1
 ishimen.co.jp, 1
 ishiro.me, 1
 ishland.com, 1
 ishopforpowerserg.com, 1
+ishotagency.com, 1
 ishtyl.com, 1
 isidore.uk, 1
 isif-ostewg.org, 1
 isiklitabela.tk, 1
 isil.fi, 1
 isimonbrown.co.uk, 1
 isimonline.tk, 1
 isincheck.com, 1
@@ -59791,17 +59760,16 @@ it-blog.cf, 1
 it-boss.ro, 1
 it-com.ga, 1
 it-ebook.ml, 1
 it-enthusiasts.tech, 1
 it-expert.tk, 1
 it-faul.de, 1
 it-inside.ch, 1
 it-jobbank.dk, 1
-it-kron.de, 1
 it-maker.eu, 1
 it-meneer.nl, 0
 it-novosti.tk, 1
 it-ottweiler.de, 1
 it-perm.tk, 1
 it-rotter.de, 1
 it-schamans.de, 1
 it-seems-to.work, 1
@@ -60300,16 +60268,17 @@ j82365.com, 1
 j9.com, 1
 j9297.co, 1
 j9297.com, 0
 j9504.com, 1
 j9507.com, 1
 j9508.com, 1
 j9511.com, 1
 j9512.com, 1
+j9514.com, 0
 j9515.com, 1
 j9516.com, 1
 j9517.com, 1
 j95app.com, 1
 j95bb.com, 1
 j95cc.com, 1
 j95dd.com, 1
 j95ee.com, 1
@@ -60764,17 +60733,16 @@ jarritos.com, 1
 jarritos.es, 1
 jarritoseurope.eu, 1
 jarritosfrance.com, 1
 jarroba.com, 1
 jarrods.tech, 1
 jarsater.com, 0
 jas-ac.com, 1
 jas-team.net, 1
-jasalokal.id, 1
 jasawebbisnis.com, 0
 jaseng.ga, 1
 jashinchan.cn, 1
 jashvaidya.com, 1
 jasik.xyz, 1
 jasl.works, 1
 jasmijnwagenaar.nl, 1
 jasminedirectory.com, 1
@@ -61014,17 +60982,16 @@ jd777.vip, 1
 jdara.com, 1
 jdassets.com, 1
 jdc.io, 1
 jdcdirectsales.com, 1
 jdcdirectsales.com.ph, 1
 jdd888.cc, 1
 jdecommastermind.com, 1
 jdefreitas.com, 1
-jdegbau.com, 1
 jdelgado.fr, 1
 jdieselmusic.com, 1
 jdinjury.com, 1
 jdjohnsonmedia.com, 1
 jdjohnsonwaterproofing.com, 1
 jdlt.co.uk, 1
 jdm.elk.pl, 1
 jdm.pl, 1
@@ -61232,17 +61199,16 @@ jeremynally.com, 1
 jeremyness.com, 1
 jeremyrobinlyons.com, 1
 jeremysnotes.com, 1
 jeremytcd.com, 1
 jeremywinn.com, 1
 jeremywinn.xyz, 1
 jericamacmillan.com, 1
 jerichoproject.org, 1
-jering.tech, 1
 jerisandoval.tk, 1
 jerixmx.com, 1
 jermann.biz, 1
 jerodslay.com, 1
 jeroendeneef.com, 1
 jeroendev.one, 1
 jeroendj.nl, 1
 jeroenensanne.wedding, 1
@@ -61265,16 +61231,17 @@ jerseycountyclerk-il.gov, 1
 jerseyink.net, 1
 jerseyjumpingbeans.co.uk, 1
 jerseylvi2013.org, 1
 jerseyplantsdirect.com, 0
 jerusalempersonals.ml, 1
 jerusalempersonalsers.ga, 1
 jerusalempersonalsest.ga, 1
 jesec.cn, 1
+jesec.io, 1
 jesiensredniowiecza.pl, 1
 jesmh.de, 1
 jesperandersson.tk, 1
 jespersen.tk, 1
 jesseblum.com, 1
 jessecharley.com, 1
 jessecharli.com, 1
 jessecharlie.com, 1
@@ -61500,16 +61467,17 @@ jimmycarterlibrary.gov, 1
 jimmykey.com, 1
 jimobbs.tk, 1
 jimsheatandcool.com, 1
 jimslop.nl, 1
 jimucho.online, 1
 jimvophotography.tk, 1
 jimwoodrealty.com, 1
 jimwoodrealty.help, 1
+jin-dan.site, 0
 jinancy.fr, 1
 jinanshen.com, 1
 jinbijin.nl, 1
 jinbo123.com, 0
 jinbowiki.org, 1
 jinduoduo369.com, 1
 jinduoduo666.com, 1
 jinduoduo888.com, 1
@@ -61599,17 +61567,17 @@ jlmintegrated.com.au, 1
 jlmunn.com, 1
 jloh.co, 1
 jloh.codes, 1
 jloredux.com, 1
 jlot.org, 1
 jlpn.eu, 1
 jlpn.nl, 1
 jlponsetto.com, 1
-jlqwer.com, 0
+jlqwer.com, 1
 jlr-luxembourg.com, 1
 jls.idv.tw, 1
 jltcsecuritygroup.com, 1
 jmanalansan.com, 1
 jmap.support, 1
 jmarciniak.it, 1
 jmb.lc, 1
 jmbmexico.com, 1
@@ -62438,25 +62406,24 @@ jukkakivi.fi, 1
 jukkakivimaki.fi, 1
 jukovka.tk, 1
 juku-wing.jp, 1
 jule-spil.dk, 1
 julenetxaniz.eus, 1
 julenlanda.com, 0
 julesfrans.be, 1
 julesroovers.nl, 1
-julestern.com, 1
 julia-clarete.tk, 1
 julia-jones.org, 1
 julia-pink.org, 1
 julia.school, 1
 juliaexclusiv.com, 1
 juliajuice.net, 1
 julian-miller.de, 1
-julian-post.de, 1
+julian-post.de, 0
 julian-uphoff.de, 1
 julian-weigle.de, 1
 julian.tech, 1
 julianaedouglas.ga, 1
 julianaferrari.com.br, 1
 julianbroadway.com, 1
 juliangonggrijp.com, 1
 juliangramajo.tk, 1
@@ -62686,16 +62653,17 @@ justquoteme.ga, 1
 justrighthsc.com, 1
 justsandro.tk, 1
 justsellmycar.com, 1
 justsem.org, 1
 justsome.info, 1
 justtalk.site, 1
 justthinktwice.gov, 0
 justupdate.me, 1
+justyardsign.com, 1
 justyy.com, 1
 justzz.xyz, 1
 juszczak.io, 1
 juszkiewicz.com.pl, 1
 jutella.de, 0
 jutlander-netbank.dk, 1
 jutlander.dk, 1
 juul.xyz, 0
@@ -63122,17 +63090,16 @@ kalek.eu, 1
 kalendarabiturienta.tk, 1
 kalender.com, 1
 kalender.goip.de, 1
 kalerne.tk, 1
 kalevlamps.co.uk, 1
 kalex.nl, 1
 kaleylocks.com, 1
 kalhufvudet.se, 1
-kali.training, 1
 kaliaa.fi, 1
 kalian.cz, 1
 kaliboairport.tk, 1
 kaliforniya.tk, 1
 kalilinux.tech, 1
 kalimantan.tk, 1
 kalimari.tk, 1
 kalina.ml, 1
@@ -63300,17 +63267,16 @@ kanui.ml, 1
 kanuvu.de, 1
 kanvasbaski.tk, 1
 kanyingba.com, 1
 kanz.jp, 1
 kanzashi.com, 1
 kanzlei-gaengler.de, 1
 kanzlei-hhh.de, 1
 kanzlei-oehler.com, 1
-kanzlei-sixt.de, 1
 kanzshop.com, 1
 kaohongshu.blog, 1
 kaosintesta.tk, 1
 kap-genial.de, 1
 kap-kirche.de, 1
 kap.pe, 1
 kapanlagi.gq, 1
 kapelya.gq, 1
@@ -64562,17 +64528,16 @@ kingclass.cn, 1
 kingcourriel.fr, 1
 kingdomcoffee.co, 1
 kingdomcrawlers.tk, 1
 kingdominnergy.com, 1
 kingdommindsmentorsclub.com, 1
 kingdoms.gg, 1
 kingfast.cc, 1
 kingfast.eu.org, 1
-kingfin.com, 1
 kingiescastles.co.uk, 1
 kingjamesbibleonline.org, 1
 kingjamesgospel.com, 1
 kinglaksa.com, 0
 kinglier.ga, 1
 kingliey.ga, 1
 kingmakers.academy, 1
 kingmakers.eu, 1
@@ -64758,16 +64723,17 @@ kissoft.ro, 1
 kisstube.tv, 1
 kistipro.tk, 1
 kisulki.tk, 1
 kisumuterraceapartments.tk, 1
 kisvasut.tk, 1
 kita-freie-schule.de, 1
 kita-sun.com, 1
 kitabat.com, 1
+kitabgaul.com, 0
 kitabnamabayi.com, 1
 kitacoffee.com, 1
 kitagawa-internal-medicine-clinic.com, 1
 kitchen-design.cf, 1
 kitchen-design.tk, 1
 kitchenlove.tk, 1
 kitchenpad.biz, 1
 kitchenpad.co.uk, 1
@@ -65115,17 +65081,16 @@ kngkng.com, 1
 kniga-ru.tk, 1
 kniga.market, 0
 knigareceptov.cf, 1
 knigareceptov.tk, 1
 knighki-knighki.ml, 1
 knighkidoma.tk, 1
 knightsblog.de, 1
 knightsbridge.net, 1
-knightsbridgewine.com, 1
 knightsweep.com, 1
 knighulki.cf, 1
 knigi-free.cf, 1
 knigi-market.ml, 1
 knigi-na-dom.cf, 1
 knigi-zdes.gq, 1
 knigifast.ga, 1
 knigiunass.tk, 1
@@ -65148,17 +65113,16 @@ knnet.ch, 1
 knoji.com, 1
 knollwoodcommunity.org, 1
 knop.info, 0
 knorrnet.de, 1
 knovator.com, 1
 know.cf, 1
 knowarth.com, 1
 knowdebt.org, 1
-knowit-now.com, 1
 knowl365.com, 1
 knowledge-base.info, 0
 knowledgeforce.com, 1
 knowledgehook.com, 1
 knowledze.com, 1
 knowlevillagecc.co.uk, 1
 knownsec.cf, 1
 knowpanamatours.com, 1
@@ -65292,16 +65256,17 @@ kohparadise.com, 1
 kohsandra.com, 0
 koi-lexikon.de, 1
 koidulag.edu.ee, 1
 koifish.org, 1
 koineuno.com, 1
 koing.de, 1
 koirala.email, 1
 koiro.fi, 1
+koishi.pro, 1
 koizumidesign.com, 1
 koj.co, 1
 koji-tsujitani.net, 1
 kojiishikawa.com, 1
 kojip.com, 1
 kojipkgs.fedoraproject.org, 1
 koka-shop.de, 1
 kokankart.com, 1
@@ -65789,16 +65754,17 @@ krasnoyarsk24.tk, 1
 krasotkafirm.tk, 1
 krasotki.ml, 1
 krasovsky.me, 1
 kratochvilovi.net, 1
 kratom-k.com, 1
 krattk.de, 1
 krauseent.com, 0
 krauskopf-it.de, 1
+krautomat.com, 1
 kraynik.com, 1
 krazy.net.au, 1
 krazykastles.co.uk, 1
 krazykoolkastles.com, 1
 krazyphotobooths.co.uk, 1
 krbzh.ch, 1
 krc.link, 1
 krch.tk, 1
@@ -65953,17 +65919,16 @@ kropkait.pl, 1
 krosovki-nike.tk, 1
 krossakorven.tk, 1
 krouzkyliduska.cz, 0
 krovatka.tk, 1
 kroyou.com, 0
 krozilla.tk, 1
 krpaforum.org, 1
 krsaustralia.com.au, 1
-krsn.de, 1
 krsvrs.nl, 1
 krti.com.ua, 1
 krubik.tk, 1
 krudel.tk, 1
 krug-munroe.wedding, 1
 krugerengelbrecht.co.za, 1
 krugermillions.org, 1
 krugernationalpark.org.za, 1
@@ -65999,17 +65964,16 @@ kryptoforce.com, 1
 kryptologie.tk, 1
 kryptomech.com, 1
 kryptomodkingz.com, 1
 kryptux.xyz, 1
 kryshodel.ml, 1
 krystal-framework.ml, 1
 krytykawszystkiego.com, 1
 krytykawszystkiego.pl, 1
-kryx.de, 1
 ks-19.com, 1
 ks-39.com, 1
 ks-59.com, 1
 ks-79.com, 1
 ks-89.com, 1
 ks-watch.de, 1
 ks.kr.ua, 1
 ks009.com, 1
@@ -66659,16 +66623,17 @@ labor-augsburg-mvz.de, 1
 laboratoriodemarketingb3.com, 1
 laboratoriomolina.tk, 1
 laborbluesers.ga, 1
 laborbluesest.ga, 1
 labordayauction.org, 1
 laborriquita.tk, 1
 labortogether.com, 1
 labouncycastlehire.co.uk, 1
+labourreedevergheas.fr, 1
 laboutiquedejuliette.com, 1
 laboutiquemarocaineduconvoyeur.com, 1
 laboutiquemarocaineduconvoyeur.ma, 1
 laboxfaitsoncinema.com, 1
 labroma.tk, 1
 labs-is.com, 1
 labs.ro, 1
 labsector.com, 1
@@ -67023,16 +66988,17 @@ lamunyon.com, 0
 lan-der.de, 1
 lan-der.net, 1
 lan-divy.com, 1
 lan-divy.fr, 1
 lan.biz.tr, 1
 lan4.life, 1
 lana.swedbank.se, 1
 lanabello.com.br, 1
+lanaengel.com, 1
 lanagiselle.net, 1
 lanahallen.com, 1
 lanasomething.com, 1
 lanaturedaure.com, 1
 lanausea.tk, 1
 lanbroa.eu, 1
 lancashirecca.org.uk, 1
 lancastertableandseating.com, 1
@@ -67070,17 +67036,17 @@ landloperfm.tk, 1
 landlordy.com, 1
 landofelves.net, 0
 landofmerlin.tk, 1
 landofoz.dynu.net, 1
 landoftherisingson.com, 1
 landoncreekapartments.com, 1
 landoverhillsmd.gov, 1
 landroverexpo.com.au, 1
-landsbref.is, 1
+landsbref.is, 0
 landscape-photography.org, 1
 landscapelightingagoura.com, 1
 landscapelightingagourahills.com, 1
 landscapelightingcalabasas.com, 1
 landscapelightingcamarillo.com, 1
 landscapelightingconejovalley.com, 1
 landscapelightingdosvientos.com, 1
 landscapelightinghiddenhills.com, 1
@@ -67118,17 +67084,16 @@ langages-programmation.tk, 1
 langapi.com, 1
 langatang.com, 1
 langbein.org, 1
 langduytinh.com, 1
 langenberg.tk, 1
 langenu.tk, 1
 langgasse-baar.ch, 1
 langhof-immobilien.de, 1
-langhun.me, 1
 langjp.com, 0
 langley.tk, 1
 langleyporter.com, 1
 langlois-chateau.fr, 1
 langly.fr, 1
 langotie.com.br, 1
 langrock.info, 0
 langstreckensaufen.de, 1
@@ -67400,17 +67365,16 @@ lastsunset.tk, 1
 lastville.com, 1
 lasuzefc.fr, 1
 lasvegascasinonews.com, 1
 lasvegasgfegirls.com, 1
 laszlo.sh, 1
 laszloinstitute.com, 1
 laszlotamas.hu, 1
 lat.sk, 1
-lat46.ch, 0
 latabaccheria.net, 1
 latabledebry.be, 1
 latabledemontebello.com, 1
 latanadelpolpo.it, 1
 latardeurbana.cf, 1
 latardeurbana.ga, 1
 latardeurbana.gq, 1
 latardeurbana.ml, 1
@@ -67436,17 +67400,16 @@ lateralsecurity.com, 1
 laterremotodealcorcon.tk, 1
 latestairfaredeals.com, 1
 latestbitcoinnews.io, 1
 latestcoin.tk, 1
 latestdeals.co.uk, 1
 latestimmigrationnews.today, 1
 latestmata.com, 1
 latestmobiles.tk, 1
-latestmyanmarnews.com, 0
 latestonmarketing.com, 1
 latetrain.cn, 1
 lathamlabs.com, 1
 lathamlabs.net, 1
 lathamlabs.org, 1
 latia.tk, 1
 latiamona.com, 1
 latiendawapa.com, 1
@@ -67666,17 +67629,16 @@ lazudi.com, 1
 lazulu.com, 1
 lazurit.com, 1
 lazyboston.com, 1
 lazyframe.com, 1
 lazyhelp.com, 1
 lazysoftware.fr, 1
 lazytux.org, 1
 lazywaves.tk, 1
-lazzzy.com, 1
 lb-music.tk, 1
 lb-toner.de, 1
 lb366.cc, 1
 lb369.cc, 1
 lba-rpg.tk, 1
 lbarrios.es, 1
 lbayer.com, 1
 lbc-podcast.tk, 1
@@ -68609,17 +68571,16 @@ lesperlesdunet.tk, 1
 lespinasse.org, 1
 lesplatanes.ch, 0
 lesportmusic.tk, 1
 lespret.nl, 1
 lesprofsplacotent.com, 1
 lesptitspasdelyne.fr, 1
 lesptitstutos.fr, 1
 lesquerda.cat, 0
-lessavonnables.fr, 1
 lessets-graphiques.com, 1
 lessiamia.net, 1
 lessis.moe, 1
 lesspass.com, 1
 lestanzedelgattopardo.it, 1
 lesterchan.net, 1
 lesterrassesdusoleil.ch, 0
 lestrokeofgenius.com, 1
@@ -68830,17 +68791,16 @@ lg2.com, 1
 lgam.com, 1
 lgbt-colleges.com, 1
 lgbt.io, 1
 lgbt.ventures, 1
 lgbtventures.com, 1
 lgbusiness.es, 0
 lgerman.de, 1
 lgesteticaautomotiva.com.br, 1
-lgf.im, 0
 lghfinancialstrategy.ch, 0
 lgiswa.com.au, 1
 lgnsh.fr, 1
 lgobchod.cz, 1
 lgp.go.th, 1
 lgpecasoriginais.com.br, 1
 lgrs.com.au, 1
 lgscripts.com.br, 1
@@ -69212,17 +69172,16 @@ lightning.community, 1
 lightning.engineering, 1
 lightningpatrolers.ga, 1
 lightningpatrolest.ga, 1
 lightnings.tk, 1
 lightningseed.net, 1
 lightningwirelabs.com, 1
 lighto.pk, 1
 lightography.com, 1
-lightquantum.moe, 1
 lights.co.uk, 1
 lights0123.com, 1
 lightscale.com, 1
 lightsheep.no, 0
 lightsonbook.com, 1
 lightspeed.com, 0
 lightspeedta.co, 1
 lightsproject.com, 1
@@ -69396,17 +69355,16 @@ lincasonline.tk, 1
 lincdavis.com, 1
 lince-bonares.tk, 1
 lincnaarzorg.nl, 1
 lincolnbrokerage.com, 1
 lincolncountymoclerk.gov, 1
 lincolncountysheriffok.gov, 1
 lincolncountytn.gov, 1
 lincolncountywy.gov, 1
-lincolnfinewines.com, 1
 lincolnimps.tk, 1
 lincolnmoneyman.com, 1
 lincolnpedsgroup.com, 1
 lincolnspringsgc.com, 1
 lincolnstreetband.tk, 1
 lincore.ru, 1
 lindajahn.de, 1
 lindalap.fi, 1
@@ -69835,17 +69793,17 @@ littleqiu.net, 1
 littleredsbakeshop.com, 1
 littlericket.me, 1
 littleriverfreerange.ga, 1
 littlerose.ml, 1
 littlerphotographie.fr, 1
 littles.moe, 1
 littlescallywagsplay.co.uk, 1
 littleservice.cn, 1
-littlesk.in, 1
+littlesk.in, 0
 littleskin.cn, 1
 littleson.com.br, 1
 littlesouls.ml, 1
 littletreenc.org, 1
 littlewatcher.com, 1
 littleyokohamakennel.tk, 1
 liturgical.net, 1
 liturkey.tk, 1
@@ -69936,17 +69894,16 @@ livekortti.fi, 1
 livela.jp, 1
 livelexi.com, 1
 livelifewithintent.com, 1
 livelink.tk, 1
 livelondon.fr, 1
 livelong.tk, 1
 livelonglife.tk, 1
 livelovelaughlg.com, 1
-livelyapps.com, 1
 liveman.dk, 1
 livemomentum.ml, 1
 livemosspointe.com, 1
 livenewsrussia.tk, 1
 liveomadic.com, 1
 liveoutdoor.ga, 1
 livepaperhelp.com, 1
 liveperformersmeeting.net, 1
@@ -70271,23 +70228,21 @@ locksmithdriftwood.com, 1
 locksmithedenvale24-7.co.za, 1
 locksmithedmonds.com, 1
 locksmithforcarshoustontx.com, 1
 locksmithfourways24-7.co.za, 1
 locksmithgarland-tx.com, 1
 locksmithgermiston24-7.co.za, 1
 locksmithgrapevinetx.com, 1
 locksmithhillcrest.co.za, 1
-locksmithindurban.co.za, 1
 locksmithlakewaytx.com, 1
 locksmithlivoniami.com, 1
 locksmithmadisonheights.com, 1
 locksmithmesquitetexas.com, 1
 locksmithmesquitetx.com, 1
-locksmithmidrand24-7.co.za, 1
 locksmithmissouricity.com, 1
 locksmithopen.com, 1
 locksmithresidentialspringtx.com, 1
 locksmithsammamishwa.com, 1
 locksmithsbluff.com, 1
 locksmithsbuda.com, 1
 locksmithscottsdaleaz.com, 1
 locksmithservice-cypress.com, 1
@@ -70471,17 +70426,16 @@ lojavirtualdopsicopedagogo.com.br, 1
 lojavirtualinfopaper.com.br, 1
 lojavisamed.com.br, 1
 lojaxo.com.br, 1
 lojix.com, 0
 lojj.pt, 1
 lokaal.org, 1
 lokal-speisen.de, 1
 lokalna.net, 1
-lokan.id, 1
 loker.id, 1
 lokjagruktafoundation.com, 1
 lokomotivaplzen.cz, 1
 lokusec.com, 1
 lokys.de, 1
 lola.by, 1
 lolacandy.com, 1
 lolalacita.net, 1
@@ -70489,17 +70443,16 @@ lolas-vip.com, 1
 lolaseuropeancafe.com, 1
 lolbird.tk, 1
 lolcats.tk, 1
 lolcloud.ru, 1
 lolcorp.pl, 1
 lolcosplay.ga, 1
 lolcow.farm, 1
 lolcow.org, 1
-lolcow.su, 1
 loldudes.com, 1
 lolfunny.tk, 1
 loli.art, 1
 loli.com, 1
 loli.edu.kg, 1
 loli.gallery, 1
 loli.io, 1
 loli.net, 1
@@ -70668,16 +70621,17 @@ lonlomba.com, 1
 lonniec.com, 1
 lonniemason.net, 1
 lonza.co.nz, 1
 loober.tk, 1
 loodsen.ru, 1
 look-books.tk, 1
 look-info.tk, 1
 look-like.tk, 1
+look.co.il, 1
 lookae.com, 0
 lookagain.co.uk, 1
 lookasik.eu, 1
 lookastic.com, 1
 lookastic.de, 1
 lookastic.es, 1
 lookastic.fr, 1
 lookastic.ru, 1
@@ -70689,17 +70643,17 @@ lookgadgets.com, 1
 lookie.ml, 1
 lookingstores.fr, 0
 lookup-dns.net, 1
 loomis.center, 1
 loonbedrijfdenboer.nl, 1
 looneymooney.com, 1
 loony.info, 0
 loonylatke.com, 1
-loopback.kr, 0
+loopback.kr, 1
 loopcore.de, 1
 loopkey.com.br, 1
 loopool.tk, 1
 looseleafsecurity.com, 1
 loothole.com, 1
 loots.eu, 1
 lootslot.com, 1
 looxent.com, 1
@@ -71239,17 +71193,16 @@ ludotech.tk, 1
 ludothek-burgdorf.ch, 1
 ludovic-frank.fr, 1
 ludovic-muller.fr, 1
 ludovicfernez.com, 1
 ludum-polus.xyz, 1
 ludum.pl, 1
 ludunwayoo.com, 1
 ludwig.im, 1
-ludwiggrill.de, 1
 ludwigjohnson.se, 1
 ludwigpro.net, 1
 lueck-bertram.de, 1
 luedeke-bremen.eu, 1
 lueersen.homedns.org, 1
 luehne.de, 1
 luelistan.net, 0
 luematecidos.com.br, 1
@@ -71325,16 +71278,17 @@ lukaszwojcik.com, 1
 lukaszwojcik.net, 1
 luke-hacks.com, 1
 luke.ch, 1
 luke.id, 1
 luke6887.me, 1
 lukeistschuld.de, 1
 lukekuza.com, 1
 lukekuza.me, 1
+lukem.eu, 0
 lukem.net, 1
 lukeng.net, 1
 lukepeltier.com, 1
 luker.org, 1
 lukersallamericanstorage.com, 1
 lukersstorage.com, 1
 lukerstorage.com, 1
 lukertech.net, 1
@@ -71490,17 +71444,16 @@ lutricia.tk, 1
 lutruwita.com, 1
 luukaslindsey.tk, 1
 luukdebruincv.nl, 0
 luukklene.nl, 1
 luukuton.fi, 1
 luuppi.fi, 1
 luv-scent.com, 1
 luv.asn.au, 1
-luv2watchmycam.com, 1
 luvare.com, 1
 luvbridal.com.au, 1
 luvey.com, 1
 luvscent.com, 1
 lux-house.tk, 1
 lux.com.de, 1
 luxanos.com, 1
 luxarchive.tk, 1
@@ -71903,26 +71856,26 @@ madeinrussia.com, 1
 madeinstudio3.com, 1
 madeintucson.org, 1
 madeinua.com, 1
 madeira.link, 1
 mademoe.com, 1
 maden.com, 1
 mader.jp, 1
 maderasbrown.com, 1
-madewellwoodworks.com, 1
 madewithopendata.org, 1
 madge.tk, 1
 madhawaweb.tk, 1
 madhyrecords.com, 1
 madian.tk, 1
 madinina.tk, 1
 madirc.net, 1
 madisoncountyhelps.com, 1
 madisonent-facialplasticsurgery.com, 1
+madisonivy.space, 1
 madisonprocaccini.tk, 1
 madisonsjewelersorlando.com, 1
 madisonsquarerealestate.com, 1
 madkids.ga, 1
 madknight.tk, 1
 madlandezboard.tk, 1
 madluging.tk, 1
 madmar.ee, 1
@@ -72038,16 +71991,17 @@ magesy.blog, 1
 magewell.nl, 1
 maggie-shaw.co.uk, 0
 maggie.com, 1
 maggiemcgee.tk, 1
 maggot.cf, 1
 magi-cake.com, 1
 magiamgiatot.tk, 1
 magic-cards.info, 1
+magic-carpetcleaning.co.uk, 1
 magic-cheerleading.tk, 1
 magic-network.tk, 1
 magic-photo-events.fr, 1
 magical-secrets.com, 1
 magical.rocks, 1
 magicalwishes.tk, 1
 magicamulet.me, 1
 magicball.co, 1
@@ -72135,16 +72089,17 @@ magneticmoney.de, 1
 magnetoscopio.tk, 1
 magnetoterapiapertutti.com, 1
 magnetpass.uk, 1
 magnets.jp, 1
 magnetto.ga, 1
 magnettracker.com, 1
 magniezetassocies.fr, 1
 magnific.tk, 1
+magnificentdata.com, 1
 magniflood.com, 1
 magnitgang.ml, 1
 magnitola.ml, 1
 magnocentro.store, 1
 magnoliadoulas.com, 1
 magnoliastrong.com, 1
 magnumwallet.co, 1
 magnunbaterias.com.br, 1
@@ -73265,17 +73220,17 @@ markt-heiligenstadt.de, 0
 marktcontact.com, 1
 markterweele.nl, 1
 marktgemeinde-glonn.de, 1
 marktgorman.com, 1
 marktguru.at, 1
 marktguru.de, 1
 markup-ua.com, 1
 markus-blog.de, 1
-markus-dev.com, 1
+markus-dev.com, 0
 markus-keppeler.de, 1
 markus-musiker.de, 1
 markus-ullmann.de, 1
 markus289.com, 1
 markusabraham.com, 1
 markusehrlicher.de, 1
 markusgran.de, 1
 markusjanzen.de, 1
@@ -74041,17 +73996,16 @@ maxopolyworldnews.com, 1
 maxp.info, 0
 maxpl0it.com, 1
 maxportal.tk, 1
 maxr1998.de, 1
 maxrandolph.com, 1
 maxratmeyer.com, 1
 maxrickettsuy.com, 1
 maxrider.tk, 1
-maxs.com, 1
 maxtruxa.com, 1
 maxundlara.at, 1
 maxundlara.com, 1
 maxundlara.eu, 1
 maxundlara.org, 1
 maxus.tk, 1
 maxvaluedeals.com, 1
 maxverboom.nl, 1
@@ -75541,16 +75495,17 @@ merenita.net, 1
 merenita.nl, 1
 merezha.ua, 1
 mergellina.tk, 1
 meric-graphisme.info, 1
 meridanas.me, 1
 meridiangroup.ml, 1
 meridianmetals.com, 1
 meridianoshop.com.br, 1
+meridianstore.com.br, 1
 merikserver.tk, 1
 merkattumaa.tk, 1
 merkchest.tk, 1
 merke.tk, 1
 merkel.me, 1
 merkleforest.xyz, 1
 merklin.gq, 1
 merlet.eu, 1
@@ -75762,17 +75717,16 @@ metro-vet.co.uk, 1
 metro-web.net, 1
 metrobriefs.com, 0
 metrobus.co.uk, 1
 metrocraft2033.tk, 1
 metrodemaracaibo.tk, 1
 metrofree.ga, 1
 metroline.ml, 1
 metrolush.com, 1
-metromas.com, 1
 metron-eging.com, 1
 metron-networks.com, 1
 metron-online.com, 1
 metron.mv, 1
 metronidazolee.gq, 1
 metronome.ga, 1
 metrophone.vn, 0
 metroplex.me, 1
@@ -75944,17 +75898,16 @@ miamibeachcommunitychurch.com, 1
 miamifl.casa, 1
 miamifl.homes, 1
 miamimosque.org, 1
 miamiobgyndreams.com, 1
 mianbao.ga, 1
 miankamran.tk, 1
 miao.team, 1
 miaoft.com, 1
-miaomiao.eu.org, 1
 miaovps.com, 1
 miaowo.org, 1
 miap.eu, 1
 miasarafina.de, 1
 miasma.tk, 1
 miasonne.com, 1
 miatfactory.be, 1
 miatgent.be, 1
@@ -75985,16 +75938,17 @@ michael-r.dynv6.net, 1
 michael-rigart.be, 1
 michael-schefczyk.de, 1
 michael-simon.de, 1
 michael-steinhauer.eu, 1
 michaelabbas.tk, 1
 michaelamead.com, 1
 michaelasawyer.com, 1
 michaelband.co, 1
+michaelband.com, 1
 michaelbeer.co.uk, 1
 michaelbondar.tk, 1
 michaelboogerd.tk, 1
 michaelcailloux.com, 1
 michaelcullen.name, 1
 michaeldancot.com, 1
 michaeldavidsonmusic.com, 1
 michaelduhamel.com, 1
@@ -76226,17 +76180,16 @@ migueldemoura.com, 1
 migueldominguez.ch, 0
 miguelgaton.es, 1
 miguelito.tk, 1
 miguelmartinez.ch, 0
 miguelmenendez.pro, 1
 miguelmoura.com, 1
 migueloblitas.tk, 1
 miguelpallardo.tk, 1
-miguia.tv, 1
 mihaiordean.com, 1
 mihalgrameno.ml, 1
 mihalicka.com, 1
 mihanwebtest.tk, 1
 mihaylov.tk, 1
 mihealth.link, 1
 mihealthl.ink, 1
 mihgroup.eu.org, 1
@@ -76338,16 +76291,17 @@ mikino.gq, 1
 mikino.ml, 1
 mikkei.space, 1
 mikkel.cc, 1
 mikkelladegaard.dk, 0
 mikkelscheike.com, 1
 mikkelvej.dk, 1
 mikkohuupponen.com, 1
 mikkonen.bio, 1
+mikkosa.fi, 0
 miklagard.dk, 1
 miklcct.com, 1
 mikmik.co.il, 1
 miknight.com, 1
 mikonmaa.fi, 1
 mikori.sk, 1
 mikos.tk, 1
 mikrokolektyw.com, 1
@@ -76434,17 +76388,16 @@ miller-shop.cf, 1
 milleralarms.co.uk, 1
 millerandzois.com, 1
 millercountyga.gov, 1
 milleron.net, 1
 milleron.xyz, 1
 millerpaving.com, 1
 millersminibarns.com, 1
 millersprolandscape.com, 0
-millerwalker.com, 1
 millettable.com, 1
 milliarden-liste.de, 1
 millibirlik.tk, 1
 millibitcoin.jp, 1
 milliegrace.org, 1
 millikart.az, 1
 millionaireclub.tk, 1
 millionairemethodsacademy.tk, 1
@@ -77058,17 +77011,16 @@ mizukoshika.jp, 1
 mizumax.me, 1
 mj420.com, 1
 mjacobson.net, 1
 mjanja.ch, 1
 mjasm.org, 1
 mjhs.org, 1
 mjhsfoundation.org, 1
 mjjlab.com, 1
-mjkholding.nl, 1
 mjmedia.co.za, 1
 mjniessen.com, 1
 mjollnir.fr, 1
 mjrlegends.com, 1
 mjs-domy.pl, 1
 mjsacco-dwi.com, 1
 mjsacco.com, 1
 mjscustomcreations.com.au, 1
@@ -78394,16 +78346,17 @@ moviro.net, 1
 movlib.org, 1
 movnest.com, 1
 mowing-the-lawn.com, 1
 moxiegirlz.id, 1
 moy-biznes.tk, 1
 moy-gorod.od.ua, 0
 moy.cat, 1
 moybiznes.tk, 1
+moyer.pub, 0
 moyideal.tk, 1
 moylen.eu, 1
 moyminsk.tk, 1
 moyoo.net, 1
 moyu.host, 0
 moyufangge.com, 1
 mozart-vision.com, 1
 mozartgroup.hu, 1
@@ -78761,16 +78714,17 @@ muclan.tk, 1
 mucmail.de, 1
 mudanzasacuna.com.co, 1
 mudanzasjuniorh.com, 1
 mudanzasuiza.com.ec, 1
 mudanzasytransportesbh.com, 1
 mudaomundo.org, 1
 mudareganhar.pt, 0
 mudasobwa.tk, 1
+mudaustralia.com, 1
 mudbenesov.cz, 1
 mudcomplex.ga, 1
 mudcomplexers.ga, 1
 mudcrab.us, 0
 muddy-landrover.tk, 1
 mudgezero.one, 1
 mudit.xyz, 0
 mudpiles.cat, 1
@@ -78798,17 +78752,16 @@ mugfanatic.com, 1
 mugrabyhostel.tk, 1
 muguayuan.com, 1
 muh.io, 1
 muhabarishaji.com, 0
 muhafazakarkiralikvilla.com, 1
 muhammed.tk, 1
 muhasebekurslari.tk, 1
 muhcow.dk, 1
-muhelheim.com, 1
 muhibbulislam.tk, 1
 muhiminulhasan.me, 1
 muhlenbergtwppa.gov, 1
 muhrielle.org, 1
 mui.kitchen, 1
 mui.today, 1
 muii.com.br, 1
 muii.in, 1
@@ -80110,17 +80063,16 @@ n2canada.ca, 1
 n2diving.net, 1
 n2o.io, 1
 n2ray.xyz, 1
 n36533.com, 1
 n37.co, 1
 n3oxid.fr, 1
 n3rd0rama.tk, 1
 n4mullingartolongford.ie, 1
-n4zm.com, 1
 n5118.com, 1
 n5197.co, 1
 n61roscommon.ie, 1
 n6729.co, 1
 n6729.com, 1
 n6957.co, 1
 n6a.net, 1
 n7.education, 1
@@ -80213,16 +80165,17 @@ nadine-birkner.de, 1
 nadine-chaudier.net, 1
 nadinecays.com, 1
 nadinethings.gq, 1
 nadir.tk, 1
 nadjabenaissa.tk, 1
 nadjasummer.com, 1
 nadlerdentistry.com, 1
 nadomna-rabota.tk, 1
+nadoske.info, 1
 nadsandgams.com, 1
 naduvilathu.tk, 1
 nadyaolcer.fr, 1
 naehkurshamburg.de, 1
 naemnuk.tk, 1
 nafod.net, 1
 nafoods.com, 1
 naga-semi.com, 1
@@ -80289,17 +80242,16 @@ najiflix.fr, 1
 najprzepis.pl, 1
 najrecept.sk, 1
 naka.io, 1
 nakaci.de, 1
 nakacide.com, 1
 nakada4610.com, 1
 nakagawa-d.co.jp, 1
 nakagawa-s.jp, 1
-nakajims.net, 1
 nakalabo.jp, 1
 nakama.tv, 1
 nakamastudios.com, 1
 nakanishi-paint.com, 1
 nakarkhana.com, 1
 nakayama.industries, 1
 nakayama.systems, 1
 nakayamaresearch.com, 1
@@ -80345,16 +80297,17 @@ namdak.com, 1
 namecoin.info, 1
 namecoin.org, 1
 namegen.jp, 1
 namegrep.com, 1
 nameid.org, 1
 namepros.com, 1
 nameproscdn.com, 1
 namereel.com, 1
+namesbee.com, 0
 nameshield.com, 1
 nameshield.net, 1
 namesnack.com, 1
 namestormers.com, 1
 namethatporn.com, 1
 namethissymbol.com, 1
 nametiles.co, 1
 namevirus.com, 1
@@ -80598,16 +80551,17 @@ natasabekvalac.tk, 1
 natasasavija.tk, 1
 nataschaskraamzorg.nl, 1
 natashacampos.com.br, 1
 natashacampos.nl, 1
 natashavaz.nl, 1
 natashki.tk, 1
 natasjaversantvoort.nl, 1
 natation-nsh.com, 0
+natchmatch.com, 1
 nate.sh, 1
 nateandxtina.wedding, 1
 nategreen.org, 0
 natehobi.com, 1
 natelefon.tk, 1
 natenom.com, 1
 natenom.de, 1
 natenom.name, 1
@@ -80629,17 +80583,16 @@ nathanielknight.ca, 1
 nathanielparker.com, 0
 nathanielparker.de, 0
 nathanielparker.info, 0
 nathanielparker.org, 0
 nathanielsigal.com, 1
 nathankonopinski.com, 0
 nathanmfarrugia.com, 1
 nathanphoenix.com, 1
-nathans.com.au, 1
 nathansmetana.com, 1
 nathenmaxwell.tk, 1
 nathumarket.com.br, 1
 national-anime.com, 1
 national.co.ua, 1
 nationalacademic.nl, 1
 nationalaustriabank.com, 1
 nationalbank.gov, 1
@@ -80909,16 +80862,17 @@ ncsccs.com, 1
 nctx.co.uk, 1
 ncua.gov, 1
 ncuc.gov, 1
 nd.fyi, 1
 ndaal.eu, 1
 ndarville.com, 1
 ndbt.com, 1
 ndcpolipak.com, 1
+nder.be, 1
 ndev.tk, 1
 ndfirefighter.com, 1
 ndhlink.com, 1
 ndibba.com, 1
 ndlegis.gov, 1
 ndlegistest.gov, 1
 ndmath.club, 1
 ndmibiza.com, 1
@@ -81535,16 +81489,17 @@ netzen.tk, 1
 netzer-stuttgart.de, 1
 netzer.ml, 1
 netzfabrik.com, 1
 netzfrauen.org, 1
 netzklad.de, 1
 netzona.org, 1
 netzspielplatz.de, 0
 netzsv.website, 1
+netztest.at, 1
 netzvieh.de, 1
 netzwerk-lq.com, 1
 netzwerk-sozialliberal.de, 1
 netzwerkwerk.de, 1
 neuber.uno, 1
 neuch.info, 0
 neue-energien.tk, 1
 neuelandschaft-welzow.de, 1
@@ -81710,17 +81665,17 @@ newhope.org.au, 1
 newhopeofindiana.org, 1
 newhopeplacement.com, 1
 newillusion.tk, 1
 newind.info, 1
 newinf.at, 1
 newinternet.media, 1
 newizv.ru, 0
 newjerseyvideography.com, 1
-newjianzhi.com, 1
+newjianzhi.com, 0
 newknd.com, 1
 newlegalsteroid.com, 1
 newlifehempoil.com, 1
 newlight.net.br, 1
 newlovers.ga, 1
 newlovers.gq, 1
 newlynamed.com, 1
 newlytricks.ml, 1
@@ -82802,16 +82757,17 @@ nomasfraudecolorado.gov, 1
 nomaspicaduras.com, 1
 nomaster.cc, 1
 nomenclator.org, 1
 nomesbiblicos.com, 1
 nomial.co.uk, 1
 nomifensine.com, 1
 nomik.xyz, 1
 nomio.com, 1
+nomo.my, 1
 nomoondev.azurewebsites.net, 1
 nomsing.tk, 1
 nomsy.net, 1
 nomzamo.spdns.org, 1
 noname-ev.de, 1
 nonametheme.com, 1
 noncombatant.org, 1
 nonemail.ch, 1
@@ -82918,16 +82874,17 @@ nordwaldzendo.de, 1
 noref.tk, 1
 noregrets.tk, 1
 noreply.mx, 1
 norfolkgardencare.co.uk, 1
 norichanmama.com, 1
 noriel.ro, 1
 norikazumatsuno.tk, 1
 noris.de, 0
+noriskit.nl, 1
 noritakechina.com, 1
 normaculta.com.br, 1
 normalady.com, 1
 normalized.ga, 1
 normalporter.tk, 1
 normalsecurity.com, 1
 norman-legal.com, 1
 norman-preusser-gmbh.de, 1
@@ -83149,16 +83106,17 @@ notnewz.tk, 1
 notnize.net, 1
 notnl.com, 1
 notofilia.com, 1
 notonprem.com, 1
 notora.tech, 1
 notoriousdev.com, 1
 nototema.com, 1
 notre-planete.info, 1
+notrecinema.com, 1
 notrefuse.tk, 1
 notrero13.com, 1
 notresiteduvercors.tk, 1
 notryden.com, 1
 notsafefor.work, 1
 nottinghammoneyman.com, 1
 nottres.com, 1
 notube.net, 1
@@ -83270,17 +83228,16 @@ novysvit.com.ua, 1
 now.sh, 1
 now101atm.tk, 1
 nowaovivo.com.br, 1
 nowarning.cc, 1
 nowbb.tk, 1
 nowcomplete.com.br, 1
 nowebsite.tk, 1
 nowecor.de, 1
-noweigh.co.uk, 1
 nowhere.dk, 1
 nowinkijedynki.tk, 1
 nowitzki.network, 1
 nowlas.org, 0
 nowloading.co, 1
 nowloading.tk, 1
 nowoczesnysalon.ga, 1
 nowremindme.com, 1
@@ -83337,16 +83294,17 @@ nrdstd.io, 1
 nrealsport.com, 1
 nrev.ch, 0
 nrg.edu.ee, 1
 nriol.net, 1
 nrkn.fr, 1
 nrldc.in, 0
 nrm.co.nz, 1
 nrmc.pt, 1
+nrnjn.xyz, 0
 nrsmart.com, 1
 nrsweb.org, 1
 nrthcdn.me, 1
 nrv-linux.io, 1
 nrvc.net, 1
 nrvn.cc, 0
 nrvnastudios.com, 1
 ns-frontier.com, 1
@@ -84005,17 +83963,16 @@ oceanofpdf.com, 1
 oceanshaman.cf, 1
 oceanshaman.ga, 1
 oceanshaman.gq, 1
 oceanshaman.ml, 1
 oceansidetour.tk, 1
 oceanspringsarchives.net, 1
 oceansurplus.tk, 1
 oceanviewde.gov, 1
-oceanvisuals.com, 1
 ocebot.net, 1
 ocenilla.ml, 1
 ocenilla.tk, 1
 oceniteli.bg, 1
 ocenka-nedv.ml, 1
 ocenka.tk, 1
 ocenovani-inspekce.cz, 1
 ocf.io, 1
@@ -84129,17 +84086,16 @@ odonoghue.kiwi, 0
 odonti.com, 1
 odontologiawilliampizarro.com, 1
 odoo.co.th, 1
 odoru.ga, 1
 odorucinema.ga, 1
 odosblog.de, 1
 odpikedoslike.com, 1
 odsylvie.cz, 1
-oduachambers.com, 1
 oducs.org, 1
 odvps.com, 0
 odxin.com, 1
 odysea.cat, 1
 odyso.org, 1
 odyssee-animation.tk, 1
 odyssey44.com, 1
 odysseyofthemind.eu, 1
@@ -84175,17 +84131,16 @@ oertle.tk, 1
 oessi.eu, 1
 oestemc.com.br, 1
 oesterbaron.nl, 1
 oesterreichjobs.com, 1
 oetzies-quiz.com, 1
 oevkg.at, 1
 of-sound-mind.com, 1
 of2106.dnsalias.org, 0
-of2m.fr, 1
 ofallonil.gov, 1
 ofaqim.city, 1
 ofasoft.com, 1
 ofcampuslausanne.ch, 0
 ofelia.tk, 1
 ofertasadsl.com, 1
 ofertastop.es, 1
 ofertaviva.com.br, 1
@@ -84198,17 +84153,16 @@ offbeatbits.com, 1
 offbyinfinity.com, 1
 offcasesstore.com, 1
 offenekommune.de, 1
 offenes-deutschland.de, 1
 offensity.com, 1
 offentligsektormedmoln.se, 1
 offer-today.ml, 1
 offerhome.com, 1
-offerito.com, 1
 offermann-koeln.de, 1
 offers-daraghmehstores.com, 1
 offerte-gas.it, 1
 offerte-luce.it, 1
 offeryep.info, 1
 offgames.io, 1
 offgridauto.com, 1
 office-addins.com, 1
@@ -84341,17 +84295,17 @@ ohome.io, 1
 ohoreviews.com, 1
 ohrange-music.tk, 1
 ohreally.de, 1
 ohs.on.ca, 1
 ohsohairy.co.uk, 1
 ohyooo.com, 1
 ohype.ga, 1
 ohype.gq, 1
-oi-wiki.org, 0
+oi-wiki.org, 1
 oiahe.org.uk, 1
 oic-ci.gc.ca, 1
 oidrava.tk, 1
 oifc.in, 1
 oikontroloi.tk, 1
 oikosweb.com, 1
 oil-heaters.tk, 1
 oilfieldinjury.attorney, 1
@@ -84487,17 +84441,16 @@ oldbrookmarqueehire.co.uk, 1
 oldcars.tk, 1
 oldcastle.tk, 1
 oldcc.gov, 1
 oldcity.tk, 1
 oldcitysmokehouse.com, 1
 oldcold.co, 1
 oldcraft-mc.ru, 1
 olddisk.ml, 1
-oldenglishsheepdog.com.br, 1
 oldenzaal.tk, 1
 older-racer.com, 1
 oldfarming.tk, 1
 oldfieldmusic.tk, 1
 oldfriends.tk, 1
 oldhouse.tk, 1
 oldiesmusicguide.tk, 1
 oldiesradio.tk, 1
@@ -84659,16 +84612,17 @@ olympiamanzanilla.tk, 1
 olympic-research.com, 1
 olympicfitness.com.mx, 1
 olympiclodge.com, 1
 om.yoga, 1
 om1.com, 1
 omachi.top, 1
 omaedu.ro, 1
 omag.gov, 1
+omahachapterone.org, 1
 omaharoofpros.com, 1
 omahcoin.com, 1
 omandatapark.com, 1
 omangrid.com, 1
 omanhr.cf, 1
 omanko.porn, 0
 omaosurveys.org, 0
 omarans.com, 1
@@ -84806,17 +84760,16 @@ ondrej.org, 1
 ondrejbudin.cz, 1
 ondrejhoralek.cz, 1
 ondrejsramek.cz, 1
 ondrejvasicek.cz, 1
 one-clue.com, 1
 one-cozmic.com, 1
 one-dot.de, 1
 one-host.ga, 1
-one-million-places.com, 1
 one-news.net, 0
 one-page.org, 1
 one-pixel.tk, 1
 one-resource.com, 1
 one-s.co.jp, 1
 one-tab.com, 1
 one-two.ro, 1
 one6688.com, 1
@@ -85344,16 +85297,17 @@ opentable.com.au, 1
 opentrack.info, 1
 opentrash.org, 1
 openverse.com, 1
 openvision.tk, 1
 openvz.org, 1
 openwaveguide.de, 1
 openwifi.gr, 1
 openwrt-dist.tk, 1
+opera.im, 1
 operacdn.com, 1
 operacionlimpieza.com, 1
 operad.fr, 1
 operadotejo.org, 1
 operalogg.com, 1
 operanavigation.ro, 1
 operatic.gq, 1
 operationforever.com, 1
@@ -85777,17 +85731,16 @@ ortoemangiato.it, 1
 ortoinnovapanama.com, 1
 ortop.ua, 1
 ortopedia.tk, 1
 ortopertutti.it, 1
 oruggt.is, 1
 orum.in, 1
 orunodoy.com, 1
 orwell.tk, 1
-orwell1984.today, 1
 oryva.com, 1
 orz.uno, 1
 orzechot.pl, 1
 os-s.net, 1
 os-t.de, 1
 os.ax, 1
 os24.cz, 1
 os76.xyz, 1
@@ -85819,16 +85772,17 @@ osburn.com, 1
 oscar.ms, 1
 oscarmartinez.tk, 1
 oscars-web.tk, 1
 oscarsalas.tk, 1
 oscarspatiobar.com, 1
 oscarvk.ch, 1
 osceolacountyia.gov, 1
 osci.io, 1
+oscie.net, 1
 oscillation-services.fr, 1
 oscloud.com, 1
 oscom.tk, 1
 oscpi.com, 1
 oscreen.ru, 1
 osdeployments.com, 1
 osdls.gov, 1
 osdnc.com, 1
@@ -85860,17 +85814,16 @@ oskuro.net, 1
 osla.org, 1
 oslinux.net, 1
 oslo-kammerorkester.no, 1
 osm.is, 1
 osm.org, 1
 osm.ovh, 1
 osmaniyehaber.tk, 1
 osmanlitakilari.tk, 1
-osmanlitorunu.com, 1
 osmarks.net, 1
 osmarks.tk, 1
 osmdroid.net, 1
 osmiorniczkowo.pl, 1
 osmosebox.com, 1
 osmosis-inversa.online, 1
 osmosis.org, 1
 osmre.gov, 1
@@ -86331,17 +86284,16 @@ p-k-b.com, 1
 p-konto.tk, 1
 p-mint.jp, 1
 p-p.site, 1
 p-pc.de, 1
 p-s-b.com, 1
 p-soc.com.br, 1
 p-store.net, 1
 p-t.io, 1
-p-vegas.com, 1
 p.linode.com, 0
 p.lu, 1
 p.sb, 1
 p02.de, 1
 p10.ru, 1
 p1984.nl, 0
 p1cn.com, 1
 p1group.com, 1
@@ -86428,17 +86380,16 @@ pablofain.com, 1
 pablofonta.es, 1
 pablomachado.tk, 1
 pablomolina.tk, 1
 pablomoreno.tk, 1
 pablonadiecomotu.tk, 1
 pabloroblesminister.com, 1
 pablosaraiva.com, 1
 pabpunk.tk, 1
-pacaom.com, 1
 pacatlantic.com, 1
 pacay.id, 1
 pacch.io, 1
 pacchioni.me, 1
 pacco.tk, 1
 paccolat.name, 1
 pace.car, 1
 pace99.biz, 1
@@ -86707,17 +86658,16 @@ paless-aless.by, 1
 palessit.com, 1
 palestra.roma.it, 1
 paletdecor.com.ua, 1
 paletten.tk, 1
 palfut.com, 1
 paliucuiciucci.tk, 1
 palladium46.com, 1
 palladiumprivate.com, 1
-palladiumtechs.com, 1
 palletflow.com, 1
 palli.ch, 0
 palmaprop.com, 1
 palmarinaestrada.com.br, 1
 palmavile.us, 0
 palmaville.com, 0
 palmbeachcuisine.com, 1
 palmbeachelections.gov, 1
@@ -86883,17 +86833,16 @@ pantsu.club, 1
 pantsuservice.tk, 1
 pantypit.com, 1
 panzdravi.cz, 1
 panzer72.ru, 1
 panzers.tk, 1
 panzerwarmodsru.tk, 1
 pao.moe, 1
 paocaibang.net, 1
-paocloud.co.th, 1
 paolodemichele.it, 0
 paolomargari.tk, 1
 paolotagliaferri.com, 1
 pap-pap.ga, 1
 pap.la, 0
 papa---mama.tk, 1
 papa-webzeit.de, 1
 papabearsautocenter.com, 1
@@ -86988,17 +86937,16 @@ parallelpython.com, 1
 paralleum.cz, 1
 paraluman.be, 1
 paralysis.ga, 1
 paramapa.com.py, 1
 paramaquetas.com, 1
 paramascotas.vip, 1
 parameterizer.me, 1
 paramo-pineiro.tk, 1
-paramo.me, 1
 paramountdentalcenter.com, 1
 paramountelectronics.co.uk, 1
 paranoidandroid.tk, 1
 paranoidpengu.in, 1
 paranoidpenguin.net, 1
 paranormales.tk, 1
 paranoxer.hu, 1
 paranoxido.tk, 1
@@ -87124,16 +87072,17 @@ parleamonluc.fr, 1
 parlerdeathcountdown.com, 1
 parleu2016.nl, 1
 parleur.net, 1
 parmartecultura.it, 1
 parmatoday.it, 1
 parmels.com.br, 1
 parmoli.tk, 1
 parnassys.net, 1
+parniplus.com, 1
 parnizaziteksasko.cz, 1
 parodesigns.com, 1
 paroisses-theix-surzur.com, 1
 parolu.io, 1
 parovozov.ga, 1
 paroxetine.gq, 1
 parque-batlle.tk, 1
 parquebatlle.tk, 1
@@ -87739,16 +87688,17 @@ pcmkrembangan.or.id, 1
 pcmobile.tech, 1
 pcmr.info, 1
 pcmr.rocks, 1
 pcnewsoft.tk, 1
 pcpirates.tk, 1
 pcplaza.tk, 1
 pcprkolo.pl, 1
 pcproblem.tk, 1
+pcpromaroc.ma, 1
 pcpuhastaja.tk, 1
 pcrab.ml, 1
 pcrecovery.ga, 1
 pcrypt.org, 1
 pcsafe.cf, 1
 pcsbrasil.ml, 1
 pcscotus.gov, 1
 pcsetting.com, 1
@@ -89155,32 +89105,32 @@ pierreau.fr, 1
 pierrebruynooghe.fr, 0
 pierrefv.com, 0
 pierrejeansuau.fr, 1
 pierreprinetti.com, 0
 pierreterrien.fr, 1
 pierreyvesdick.fr, 1
 piersmana.com, 1
 pierson.tk, 1
+piesel-piepser.de, 1
 pietbrakman.tk, 1
 pietechsf.com, 0
 pieter-verweij.nl, 1
 pieterbamps.tk, 1
 pieterbos.nl, 1
 pieterdev.net, 1
 pieterhordijk.com, 0
 pietron.name, 1
 pietrosoft.tk, 1
 pietrzyk.it, 1
 pietz.uk, 1
 piezus.ru, 1
 pif.email, 1
 piffer.ind.br, 1
 pig-breeding.tk, 1
-pigb.net, 1
 pigeonracinginformation.com, 1
 pigeons-rings.com, 1
 pigfox.com, 1
 pigslv.com, 1
 pigsolvents.com, 1
 pigzilla.co, 1
 pihaar.de, 1
 pii.bz, 1
@@ -89218,17 +89168,16 @@ pillar.us, 1
 pillitteriobgyn.com, 1
 pillow.sk, 1
 pillowcast.net, 1
 pillowexpertsers.ga, 1
 pillowexpertsest.ga, 1
 pillowfort.pub, 1
 pilot-colleges.com, 1
 pilot.co, 0
-pilot.com, 1
 pilotandy.com, 1
 pilotcareercenter.com, 1
 pilotcareercentre.com, 1
 pilotgrowth.com, 1
 pilotknobmo.gov, 1
 pilotpov.com, 1
 pilotproject.tk, 1
 pilsen.fun, 1
@@ -89557,16 +89506,17 @@ pixivimg.me, 1
 pixlfox.com, 1
 pixloc.fr, 1
 pixnel.com.br, 1
 pixodo.tk, 1
 pixojo.tk, 1
 pixshop.fr, 1
 pixstash.net, 1
 pixxxels.cc, 1
+pixyship.com, 1
 pizala.de, 1
 pizdelka.tk, 1
 pizponim.co.il, 1
 pizza-24.tk, 1
 pizza-calzone.com, 1
 pizza-curator.com, 1
 pizza-house.tk, 1
 pizza-soprano.pl, 1
@@ -89773,17 +89723,16 @@ planungsregion-abw.de, 1
 planview.com, 1
 plaque-funeraire.fr, 1
 plaque-immatriculation-auto.com, 1
 plaqueomatic.fr, 1
 plaredo.tk, 1
 plaros.ml, 1
 plasapulsa.tk, 1
 plasesolev.tk, 1
-plashenkov.com, 1
 plaskiewicz.pl, 1
 plasofficial.it, 1
 plassmann.ws, 1
 plast.bg, 1
 plast.design, 1
 plastdesign.com.ua, 1
 plastex.tk, 1
 plastic2print.com, 1
@@ -90638,16 +90587,17 @@ poolinstallers.co.za, 1
 poolmans.se, 0
 poolpowershop.de, 1
 poolsafely.gov, 1
 poolsafety.gov, 1
 poolsonline.tk, 1
 poolspa.es, 1
 pooltest.co.uk, 1
 pooltools.net, 1
+poolvilla-margarita.net, 1
 poopjournal.rocks, 1
 poopr.ru, 1
 poopthereitisla.com, 1
 poorclarepa.org, 1
 pop-culture.tk, 1
 pop.dk, 1
 pop3.jp, 0
 pop3.support, 1
@@ -91045,17 +90995,16 @@ potosi-bolivia.tk, 1
 potrahushki.tk, 1
 potreningu.pl, 1
 potrillionaires.com, 1
 potsdam.directory, 1
 pottcountyks.gov, 1
 potteranderson.com, 1
 potterish.com, 1
 potterperfect.tk, 1
-pottersheartministry.org, 1
 pottershouse.tk, 1
 potterybroker.ga, 1
 pottshome.co.uk, 1
 potty.party, 1
 potvorka.tk, 1
 potwin.tk, 1
 potworowski.de, 1
 potz.tk, 1
@@ -91671,16 +91620,17 @@ principaltoolbox.com, 1
 principedepaz.gt, 1
 principia-journal.de, 1
 principia-magazin.de, 1
 principia-online.de, 1
 princovi.cz, 1
 prinesec.com, 1
 prinice.org, 1
 print-street.tk, 1
+print3dgifts.co.uk, 1
 printbase.cz, 1
 printbigjournal.tk, 1
 printedmailbags.co.uk, 1
 printeknologies.com, 1
 printerinks.ie, 1
 printerinktoutlet.nl, 1
 printerleasing.be, 1
 printertonerkopen.nl, 1
@@ -91933,17 +91883,16 @@ procurx.pt, 1
 prod-simplesend-api.azurewebsites.net, 1
 prodampro.ru, 1
 prodatalabs.com, 1
 prodct.info, 1
 prodegree.com, 1
 prodentalsantacruz.es, 1
 prodesigntools.com, 1
 prodesk.bg, 1
-prodevsblog.com, 1
 prodhealthcare.org, 1
 prodietix.cz, 1
 prodigibook.com, 1
 prodigyhacking.com, 1
 prodigyhq.io, 1
 prodinger.com, 1
 prodottitipicidellatoscana.it, 1
 prodottogiusto.com, 1
@@ -92029,16 +91978,17 @@ profitable-textilien.ch, 1
 profitablewebprojects.com, 1
 profitmiracle.tk, 1
 profitopia.de, 1
 profkom.tk, 1
 profloorstl.com, 1
 profmetod.com, 1
 proformer.io, 1
 proformi.com, 1
+proforo.co, 1